zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/linkenpark/p/11296279.html
Copyright © 2011-2022 走看看