Java中使用Socket連接判斷Inputstream結束

        最近在試着用java寫一個socket的服務器,用python寫一個socket的客戶端來完成二者之間的通信,但是發現存在一個問題,服務器方面就卡在讀取inputsream的地方不動了,導致後面的代碼沒辦法執行,調試許久,找到問題所在

1>python中客戶端send函數發送字符串的時候沒有在字符串末尾自動加換行,而我在java服務器中使用的讀取函數爲readline()。不難想明白二者的格   式不同,所以java一直在等換行附來完成一次讀取,所以導致代碼無法繼續執行

2>在將python方面的字符串人爲的加上換行後,java服務器單行字符串讀取正常,但是出現了新問題,它不會結束讀取,一直處於等待狀態。百度之,發現解決這個問題的方法比較多,我採用的是超時判斷的辦法,即一旦讀取字符串的間隔時間超時即判定爲字符串傳輸完畢(因爲我的需求比較簡單,所以採用這種簡陋的辦法也可,實際上也可採用其他方法比如限制讀取長度,比如採用特定的字符串標記結尾)。超時會彈出超時異常,捕獲之並在catch中加入退出讀取字符串的函數即可

代碼如下:

JAVA SOCKET SERVER

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;


public class Conn extends Thread  {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Conn tmp=new Conn();
		tmp.start();
	}
	
	public void run(){
		try {
			int i=0;
			ServerSocket server=new ServerSocket(9998);
			while(true){
				System.out.println(i++);
				Socket deal=server.accept();
				BufferedReader in=new BufferedReader(new InputStreamReader(deal.getInputStream()));
				PrintWriter out = new PrintWriter(deal.getOutputStream(), true); 
				String msg=in.readLine();
				while(msg!=null){
					try{
					deal.setSoTimeout(500);
					System.out.println(msg);
					msg=in.readLine();
					System.out.println("msg:"+msg);
					deal.setSoTimeout(1);
					}
					catch(SocketTimeoutException e){
						break;
					}
				}
				out.write("ok############");
				out.flush();
				in.close();
				out.close();
				deal.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println(e.toString());
		}
	}

}



PYTHON SOCKET CLIENT

import socket
ip='127.0.0.1'
port=9998
while True:
    time.sleep(3)#控制請求發送頻率
    out= 'THIS IS A MSG'
    print out
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect((ip,port))
    client.send(out+'\n')
    print client.recv(512)
    client.close()




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章