最近在试着用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;
11 public class Conn extends Thread {
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 }
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 }
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()