最近在試着用java寫一個socket的服務器,用python寫一個socket的客戶端來完成二者之間的通信,但是發現存在一個問題,服務器方面就卡在讀取inputsream的地方不動了,導致后面的代碼沒辦法執行,調試許久,找到問題所在
1>python中客戶端send函數發送字符串的時候沒有在字符串末尾自動加換行,而我在java服務器中使用的讀取函數為readline()。不難想明白二者的格 式不同,所以java一直在等換行附來完成一次讀取,所以導致代碼無法繼續執行
2>在將python方面的字符串人為的加上換行后,java服務器單行字符串讀取正常,但是出現了新問題,它不會結束讀取,一直處於等待狀態。百度之,發現解決這個問題的方法比較多,我采用的是超時判斷的辦法,即一旦讀取字符串的間隔時間超時即判定為字符串傳輸完畢(因為我的需求比較簡單,所以采用這種簡陋的辦法也可,實際上也可采用其他方法比如限制讀取長度,比如采用特定的字符串標記結尾)。超時會彈出超時異常,捕獲之並在catch中加入退出讀取字符串的函數即可
JAVA SOCKET SERVER
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.io.PrintWriter; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 import java.net.SocketException; 8 import java.net.SocketTimeoutException; 9 10 11 public class Conn extends Thread { 12 13 /** 14 * @param args 15 */ 16 public static void main(String[] args) { 17 // TODO Auto-generated method stub 18 Conn tmp=new Conn(); 19 tmp.start(); 20 } 21 22 public void run(){ 23 try { 24 int i=0; 25 ServerSocket server=new ServerSocket(9998); 26 while(true){ 27 System.out.println(i++); 28 Socket deal=server.accept(); 29 BufferedReader in=new BufferedReader(new InputStreamReader(deal.getInputStream())); 30 PrintWriter out = new PrintWriter(deal.getOutputStream(), true); 31 String msg=in.readLine(); 32 while(msg!=null){ 33 try{ 34 deal.setSoTimeout(500); 35 System.out.println(msg); 36 msg=in.readLine(); 37 System.out.println("msg:"+msg); 38 deal.setSoTimeout(1); 39 } 40 catch(SocketTimeoutException e){ 41 break; 42 } 43 } 44 out.write("ok############"); 45 out.flush(); 46 in.close(); 47 out.close(); 48 deal.close(); 49 } 50 } catch (IOException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 System.out.println(e.toString()); 54 } 55 } 56 57 }
PYTHON SOCKET CLIENT:
1 import socket 2 ip='127.0.0.1' 3 port=9998 4 while True: 5 time.sleep(3)#控制請求發送頻率 6 out= 'THIS IS A MSG' 7 print out 8 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 9 client.connect((ip,port)) 10 client.send(out+'\n') 11 print client.recv(512) 12 client.close()