Java中使用Socket連接判斷Inputstream結束,java tcp socket服務端,python tcp socket客戶端


        最近在試着用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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM