• 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+'
    ')
    11     print client.recv(512)
    12     client.close()
  • 相关阅读:
    hdu acm 2639背包问题,这题很经典啊~~~
    hdu acm 2191
    qt中实现区域反白效果
    解决pythonxml 模块 在ubuntu karmic中找不到的问题
    Python正则表达式操作指南
    webkit 资料
    标点符号的英语名称
    ubuntu设置分辨率
    如何绑定多个action到一个slot
    改注册表,实现像迅雷一样的自定义url
  • 原文地址:https://www.cnblogs.com/linkenpark/p/11296279.html
Copyright © 2020-2023  润新知