socket網路編程java
① javaSocket網路編程怎麼實現不在同一個網路下通訊
如果你需要直接通訊,那麼這是網管的事。不通的網路是沒有辦法的。
不過如果大家都接了互聯網,那麼可以通過中間伺服器轉發的方式進行通訊。伺服器C在公網。那麼客戶端a連接C,客戶端b也連接C,就可以實現轉發。現在大規模的通訊基本都是這個方式。
② java編程中,Socket通信是怎麼實現的
java編程對於Socket之間的通信過程如下:
服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:
publicclassServer{
publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}
}
客戶端代碼
Java代碼publicclassClient{
publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}
}
③ java程序關於eclipse運行socket程序
這里你沒有理解java網路編程的原理,你這樣
的代碼運行是不可能進行通信的
問題1:
伺服器端
雖然監聽了埠,但是卻沒有建立和客戶端的連接,也沒有接受數據
問題2:客戶端雖然建立了連接,卻沒有發送數據給伺服器
具體還是多看看java網路編程(TCP/
IP網路
編程)
④ java中面向網路編程的問題Socket Serversocket
錯誤在客戶端
寫出數據的時候
要
flush()一下
String
str="用戶:tom,登錄的密碼是123";
pw.write(str);
在這個後面加個
pw.flush();
⑤ java Socket通信原理
具體如下:
首先socket 通信是基於TCP/IP 網路層上的一種傳送方式,我們通常把TCP和UDP稱為傳輸層。其中UDP是一種面向無連接的傳輸層協議。UDP不關心對端是否真正收到了傳送過去的數據。
如果需要檢查對端是否收到分組數據包,或者對端是否連接到網路,則需要在應用程序中實現。UDP常用在分組數據較少或多播、廣播通信以及視頻通信等多媒體領域。
在這里我們不進行詳細討論,這里主要講解的是基於TCP/IP協議下的socket通信。
socket是基於應用服務與TCP/IP通信之間的一個抽象,他將TCP/IP協議裡面復雜的通信邏輯進行分裝。
服務端初始化ServerSocket,然後對指定的埠進行綁定,接著對埠及進行監聽,通過調用accept方法阻塞。
此時,如果客戶端有一個socket連接到服務端,那麼服務端通過監聽和accept方法可以與客戶端進行連接。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
⑥ java做什麼會用到socket
1、web項目的話一般用到的socket比較少,因為web項目的話一般運用了一些框架,它們幫你把這些東西都封裝了,所以一般不會用到。
2、socket能然你較常接觸主要是在網路編程中,很多東西沒人幫你封裝好,你要自己親手去敲,去了解。比如你自己寫一個聊天系統,你就會較廣泛的去運用到socket
⑦ java Socket網路編程
調用 outt.flush ();
⑧ java網路編程,使用Socket訪問web伺服器
temp.length == 0 的時候退出。
下邊使用 temp 的時候 ,temp 不是 null 但是每次都能讀取到一個 0長度的返回。所以會死循環,知道伺服器斷開。
可以邊讀取socket返回就別寫入文件了呀。你這樣讀邏輯不對。
⑨ 如何把Java中的Socket類和ServerSocket類裝在一個類中,實現網路編程的通信
這個簡單 我發個程序 你看下
package server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Properties;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import util.StringUtil;
public class FromOnLineBankToBackSocket {
private static ServerSocket server; //定義伺服器埠,用於客戶短訪問
private Socket client; // 定義伺服器端套接字,用於為來訪用戶分配可使用的埠
private ClientThreads thread1; //定義線程對象
/*static {
try {
server = new ServerSocket(3000);
System.out.println(server.getLocalSocketAddress());
} catch (IOException e) {
}//實例伺服器埠號
}*/
public FromOnLineBankToBackSocket() {
try {
server = new ServerSocket(9001);
System.out.println(server.getLocalSocketAddress());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true) {
try {
client = server.accept(); //為來訪用戶分配可以使用的埠
System.out.println("***********"
+ client.getRemoteSocketAddress() + "已經連接"
+ "***********");
} catch (IOException e) {
e.printStackTrace();
}
if (client != null) { //如果埠號存在,則啟動線程
thread1 = new ClientThreads(client);
thread1.start(); //運行線程
}
}
}
public static void main(String[] args) {
new FromOnLineBankToBackSocket();//啟動服務端監聽
}
class ClientThreads extends Thread { // 線程類
private InputStream is;
private OutputStream os;
private Socket client;
public ClientThreads(Socket client) {
this.client = client;
try {
os = client.getOutputStream();
is = client.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 接收客戶端傳來的數據
*
* @return
*/
public String receive() {
byte[] buf = new byte[1024];
String s = "";
try {
int count = 0;
int times = 0;
while (is.available() == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
times++;
if (times == 10) {
break;
}
}
while (is.available() > 0) {
if ((count = is.read(buf)) != -1) {
s += new String(buf, 0, count, "UTF-8");
}
}
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
/**
* 向客戶端發送響應代碼
*
* @param s
*/
public boolean send(String msg) {
String serverIp = "192.168.0.41";
int portNo = 9578;
OutputStream out;
System.out.println("發送到後台的報文為:");
try {
Socket socket = new Socket(serverIp, portNo);
System.out.println("socket connected successful!");
out = (socket.getOutputStream());
out.write(msg.getBytes("UTF-8"));
out.flush();
try {
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 關閉響應的資源
*/
public void close() {
try {
is.close();
os.close();
client.close();
is = null;
os = null;
client = null;
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() { // 線程run方法
String msg = receive();
send(msg);
}
}
}