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 socket輸入流inputStream.read(byte[])方法一次讀入多幀數據,也就是多幀數據連在一起
在使用Java Socket的inputStream.read(byte[])方法時,如果服務端發送數據的速度超過客戶端讀取的速度,客戶端可能會一次性讀取到多幀數據連在一起的情況。這種情況下,數據包的讀取和處理就需要特別注意。一種處理方式是在服務端將每一幀數據作為一行寫入Socket,客戶端則通過BufferedReader逐行讀取。這樣可以確保每次讀取的數據都是一個完整的數據幀。
具體實現步驟如下:
1. 在服務端使用PrintWriter將數據幀作為一行寫入Socket輸出流:
2. 代碼示例如下:
java
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(data);
2. 在客戶端,通過BufferedReader逐行讀取Socket輸入流的數據:
2. 代碼示例如下:
java
BufferedReader reader = new BufferedReader(new BufferedInputStream(socket.getInputStream()));
String s = reader.readLine();
這種方式可以確保客戶端每次讀取到的數據都是一個完整的數據幀,而不會出現多幀數據連在一起的情況。通過這種方式,可以更好地管理和處理Socket通信中不同幀數據的讀取。
使用這種方法處理數據幀時,需要注意的是,每一幀數據必須以換行符結束,這樣才能被正確地解析為一行。此外,客戶端在讀取每一行數據後,應該進行適當的解析和處理,以確保數據的完整性和正確性。
通過這種方式處理數據幀,可以有效地解決服務端發送數據速度過快,而客戶端讀取速度較慢的問題,從而提高數據通信的穩定性和可靠性。
③ Java Socket 長連接怎麼實現
現編這個就是個多線程伺服器,只要在client不釋放連接,伺服器端的run里邊寫while(TRUE)循環,那麼就可以長期連接。
class ConnectionThread extends Thread{
Socket client;
int counter;
public ConnectionThread(Socket cl,int c){
client = cl;
counter= c;
}
@Override
public void run()
{
try{
String destIP=client.getInetAddress().toString();
int destport =client.getPort();
PrintStream outstream=new PrintStream(client.getOutputStream());
DataInputStream instream=new DataInputStream(client.getInputStream());
String inline=instream.readLine();
}//try
catch(IOException e){System.out.println(e);}
}//run