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

Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端的更多相关文章

  1. java中如何将OutputStream转换为InputStream

    在不需要文件生成的情况下,直接将输出流转换成输入流.可使用下面的三种方法: 如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要 ...

  2. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

  3. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  4. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...

  5. 在Java中如何高效的判断数组中是否包含某个元素

    原文出处: hollischuang(@Hollis_Chuang) 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Ove ...

  6. Java中常用的正则表达式判断,如IP地址、电话号码、邮箱等

    java中我们会常用一些判断如IP.电子邮箱.电话号码的是不是符合,那么我们怎么来判断呢,答案就是利用正则表达式来判断了,因为本人对正则表达式没有太深的研究,所有感兴趣的朋友可以自行百度.我这就给基本 ...

  7. java中等待所有线程都执行结束(转)

    转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...

  8. java中等待所有线程都执行结束

    转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...

  9. java中list集合怎么判断是否为空

    首先看下面代码 @RequestMapping("/getCatlist") public String getCatlist(HttpSession session,HttpSe ...

随机推荐

  1. 《CoderXiaoban》第九次团队作业:Beta冲刺与验收准备2

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十三 团队作业9:BETA冲刺与团队项目验收 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件黑盒 ...

  2. Oracle密码过期 ORA-28002:口令将过期 解决方法

    登录Pl/sql或导出数据时,得到的提示信息: UDE-28002: 操作产生了 Oracle 错误 28002ORA-28002: the password will expire within 7 ...

  3. ubuntu apache2.4.7配置白名单

    1.仅允许192.168.1.1访问,此处需要注意apache2.2和2.4版本之后白名单配置的方法是不一样的 <Directory /var/www/> Options FollowSy ...

  4. How to fix “Internal Diagnostics Hub Exception” in VS 2015?

    This worked for me: Stop the VSHub.exe process Delete the files in %TMP%\VsHub\ Restart the "Vi ...

  5. C语言实验二——位运算

    问题 线性反馈移位寄存器 Linear feedback shift register(LFSR),是指给定前一状态,将该输出的线性函数再用作输入的移位寄存器.异或运算是最常见的单比特线性函数:对寄存 ...

  6. netty: 解决粘包拆包: 分隔符DelimiterBasedFrameDecoder,定长消息FixedLengthFrameDecoder

    DelimiterBasedFrameDecoder 自定义分隔符 给Server发送多条信息,但是server会讲多条信息合并为一条.这时候我们需要对发生的消息指定分割,让client和server ...

  7. 国赛 strange_int

    参考文章地址https://www.52pojie.cn/thread-936377-1-1.html https://qrzbing.cn/2019/04/27/CISCN2019-strange- ...

  8. Ubuntu18.04下安装Sublime Text3并解决不能输入中文

    Ubuntu18.04下安装Sublime Text3并解决不能输入中文! 废话不多说,直接按顺序执行下面命令开始安装! wget -qO - https://download.sublimetext ...

  9. C# 避免程序重复启动

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using ...

  10. zabbix sender

    在zabbix中自定义一个虚拟主机,自定义key值,一般运用的是自动发现规则,给清单规则中配置上宏变量,通过py脚本调动zabbixsender模块,给这个主机,host发送一组包含键和宏变量的值,这 ...