我写了一个socket server的程序 为什么客户端只能运行一次,而且数据也传不到客户端

作者&投稿:大季欢 (若有异议请与网页底部的电邮联系)
Socket编程,为什么客户端无法接收来自服务器的数据~

如题,我写了段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; /** * @author Think * */ public class SocketServer { /** * @param args */ public static void main(String[] args) { new SocketServer().start(); } public void start(){ try { ServerSocket server = new ServerSocket(10086); while(true){ System.out.println("Waiting for a client..."); Socket client = server.accept(); new SocketServerThread(client).start(); } } catch (IOException e) { e.printStackTrace(); } } class SocketServerThread extends Thread{ Socket client = null; public SocketServerThread(Socket client){ this.client = client; } @Override public void run(){ try { // 得到CLIENT的输入流,从输入流出取出传输的数据 BufferedReader reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; System.out.print("from client message:"); while((line = reader_from_client.readLine()) != null){ System.out.println(line); } // 得到CLIENT端的输入流,通过向CLIENT传输数据 PrintWriter writer_to_client = new PrintWriter(client.getOutputStream()); writer_to_client.println("Ok"); writer_to_client.flush(); reader_from_client.close(); writer_to_client.close(); client.close(); } catch (IOException e) { } } } } Client
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; /** * @author Think * */ public class SocketClient { /** * @param args */ public static void main(String[] args) { try { Socket remoteServer = new Socket(InetAddress.getLocalHost(), 10086); // 得到SERVER端SOCKET的输出流,通过向输出流写入数据,与SERVER进行通信 PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true); write_to_server.write("Hello, what's you name?"); write_to_server.flush(); // 把下面这几行放开,SERVER端就收不到数据了,一直处于阻塞状态 // 得到SERVER端的输出流,从输出流中读取从SERVER传递来的数据 // BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); // String line = null; // while((line = reader_from_server.readLine()) != null){ // System.out.println(line); // } // reader_from_server.close(); write_to_server.close(); remoteServer.close(); } catch (IOException e) { e.printStackTrace(); } } }如果Client中的说明,只要是Client中放开了
BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); String line = null; while((line = reader_from_server.readLine()) != null){ System.out.println(line); } reader_from_server.close(); 这段代码,SERVER就阻塞在
while((line = reader_from_client.readLine()) != null){ 这行,不知道是哪个环节理解或处理错了,还望大家指点指点!
即使不关闭连接,也是取不到数据,看了下其它类似的提问,问题在于readLine()会导致阻塞,还在摸索解决的办法! 问题补充:wgy_superpower 写道第一:Socket编程时,永远不要在关闭写(writer)之前关闭读(reader)
第二:不管是客户端还是服务端在通过Socket读取数据的时候,在你的数据传输完成后,发送一个结束标记(比如:end),这样在你的 while循环里面判断一下数据是否已经传输完毕,完毕后跳出循环,否则由于你的程序就会一直阻塞在 readLine()这里,因为你的 socket还没有断开,会一直等待你写数据。
你说的有道理,经过后来的试验,确实是因为readLine()一直等待着客户端的输入,但此时客户端也在等待服务端的返回,所以导致两边都在那等待,就阻塞了。
一句话就是,一直【等待写数据】,但又没有数据写入,所以就卡住了。 问题补充:anranran 写道SocketServer : while((line = reader_from_client.readLine()) != null)
这个在socket没有关闭的时候是无法输出来的。
所以Server do not send any data to client嗯,也有道理,但主要不是socket没有关闭,而是没有向流中写数据,而readLine()又一直在那读取,所以就阻塞了!

1、服务端
使用ServerSocket 在确定端口之后,调用accept() 方法 。 这样 服务端就会阻塞在accept() 这里 直到有客户端请求过来 才会接着往下执行,后面你就写获取文件夹内容的具体逻辑代码 然后写入流里面 传回给客户端就可以了

2、客户端
客户端你要求每隔一段时间 有很多种方法可以实现 比如说写个timer 在间隔指定时间段向Server端发起请求就可以了,具体方式就是new Socket(ip,端口) 连接上了之后 可以得到Server端写在流里的数据 读出来就可以了

中间的细节 自己去琢磨一下 要循环往复 可以通过多线程来实现。

Socket的具体使用 可以查看官方api或者google

服务器接收不到数据,是中间环节,在传输的时候出了问题

定律是为实践和事实所证明,反映事物在一定条件下发展变化的客观规律的论断。定律是一种理论模型,它用以描述特定情况、特定尺度下的现实世界,在其它尺度下可能会失效或者不准确。

没有任何一种理论可以描述宇宙当中的所有情况,也没有任何一种理论可能完全正确。人生同样有其客观规律可循。

一、生活定律 痛苦定律:死无疑是痛苦的,然而还有比死更痛苦的东西,那就是等死。

幸福定律:如果你不再总是想着自己是否幸福时,你就获得幸福了。

错误定律:人人都会有过失,但是,只有重复这些过失时,你才犯了错误。

沉默定律:在辩论时,沉默是一种最难驳倒的观点。

动力定律:动力往往只是起源于两种原因:希望,或者绝望。

受辱定律:受辱时的唯一办法是忽视它,不能忽视它时就藐视它;如果连藐视它也不能,那么你就只能受辱了。

愚蠢定律:愚蠢大多是在手脚或舌头运转得比大脑还快的时候产生的。

化妆定律:在修饰打扮上花费的时间有多少,你就需要掩饰的缺点也就有多少。

省时定律:要想学会最节省时间的办法,首先就需要学会说"不"。

地位定律:有人站在山顶上,有人站在山脚下,虽然所处的地位不同,但在两者的眼中所看到的对方,却是同样大小的。

失败定律:失败并不以为着浪费时间与生命,却往往意味着你又有理由去拥有新的时间与生命了。

谈话定律:最使人厌烦的谈话有两种:从来不停下来想想;或者,从来也不想停下来。

误解定律:被某个人误解,麻烦并不大;被许多人误解,那麻烦就大了。

结局定律:有一个可怕的结局,也比不上没有任何结局可怕。

二、工作定律

安全定律:最安全的单位几十年没有得过安全奖(最安全证明你们安全没有做工作)

需要定律:同样两个相同的单位,同样的办公费。多少年以后,发生了变化(证明你们单位办公不需要那么多的钱)出来反对,这种成功的概论会归结为零。

评比定律:领导认为谁好,谁就好。(只要领导看你不顺眼,再辛辛苦苦地工作也是白费力气。)

一票否决定律:在一个单位,比如升工资,比如提拔任用,一个人提出来,往往成功的概率最大,而另一个人站

接受教育定律:每个单位都有吊儿郎当不好好干工作的人。但领导往往在批评这些人的时候,这些人恰恰不在场,于是,便出现了遵纪守法的人,经常接受教育的尴尬局面。

哭闹定律;那个部门没有几个因为经常的哭闹而得到了实惠,他有什么理由不经常哭闹下去。(此定理也适用那些经常在领导面前叫苦叫累的部门)

能者多劳定律:在同一科室里,有的人虽然在其岗,但却不能胜任本职工作,那他的工作只能由能胜任该项工作的人去代劳。

不平衡定律:年年当先进的部门或个人,一年没有当先进便想不通;从未当先进的部门或个人,当上先进后便想不到。

少劳多得定律:一般的单位,都分为合同工、(过去称为正式工)协议工、临时工等等。拿钱越少的工作量越大,而且越容易被解雇;拿钱越多的越没有多少事情可干,而且最不容易被解雇。

socket通信,客户端连续发送数据而服务器端只能收到一个,求解
目前的问题是客户端发送的是连续的数据,而服务器端只能接收到一个数据,客户端我只列出了线程的部分程序,这个问题已经困扰我几天了,在线等大神们的解答。
服务器端程序:

public class TCPServer {

static int port = 9800;

public static void main(String[] args) throws IOException {

ServerSocket ss = new ServerSocket(port);

boolean again = true;

while (again) {

System.out.println("TCP服务器在" + port + "等待连接...");

Socket socket = ss.accept();

System.out.println("客户端IP: " + socket.getInetAddress() + "端口号" + socket.getPort() + "已连接进来!!!");

DataInputStream dInputStream = new DataInputStream(socket.getInputStream());

//读取用户发送的数据

String data = dInputStream.readUTF();

while(data != null){

System.out.println("客户端发送的数据是: " + data);

System.out.println("555");

}

dInputStream.close();

socket.close();

ss.close();

}

}

客户端程序:

//用Socket为服务器传送数据

class NetThread extends Thread{

private TalkActivity talkActivity;

public NetThread(TalkActivity talkActivity) {

this.talkActivity = talkActivity;

}

@Override

public void run() {

try {

final Socket socket = new Socket("192.168.0.9", 9800);

os = socket.getOutputStream();

pw = new PrintWriter(os);

timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

try {

DataOutputStream dOutputStream = new DataOutputStream(socket.getOutputStream());

dOutputStream.writeUTF(data);

Log.i("peng", data);

dOutputStream.flush();

dOutputStream.close();

dOutputStream.flush();

dOutputStream.close();

} catch (Exception e) {

final String msg = e.getMessage();

//Toast.makeText(talkActivity, msg, Toast.LENGTH_SHORT).show();

}

}

}, 100, 10);

} catch (Exception e) {

final String msg = e.getMessage();

Toast.makeText(talkActivity, msg, Toast.LENGTH_SHORT).show();

}

}

}

KK3K2005KK3K2005
11-16 23:42
等级 Bbs2
1楼
String data = dInputStream.readUTF();
while(data != null){
System.out.println("客户端发送的数据是: " + data);
System.out.println("555");
data = dInputStream.readUTF();
}

至少应该有这样一行吧
1
a34140974a34140974
11-17 08:44
等级 Bbs1
2楼
服务端代码错误。可问题是,这种错误也能困扰好几天?!百思不解
0

最可能就是你server端就能连接一次,s.accept();是阻塞式方式,当得到一个连接后就往后运行,不能再接收客户端连接了

数据匹配上有问题,可以自己定义一个规则,再运行。


uniapp开发小程序兼容原生写的websocke吗?如果原生的可以用ws的吗?还是...
UniApp开发的小程序是支持原生写的WebSocket的。UniApp提供了对WebSocket的支持,可以使用原生的WebSocketAPI进行开发。你可以直接使用ws:\/\/协议的WebSocket连接,不需要必须使用wss:\/\/格式。当然,对于一些特定的需求,如在生产环境中要求使用加密连接时,建议使用wss:\/\/格式,以确保数据的安全性。总而言之,...

java的socke client端接收xml报文的问题
一次性读取是不可靠的,一般是定义一个字节数组,用一个循环读取。然后再把读到的数据加起来。主要代码:InputStream in=null;\/\/你的socket对应的接收流 ByteArrayOutputStream bo=new ByteArrayOutputStream();\/\/用来暂时存放接收到的数据的字节数组流 byte b[]=new byte[100];int length=0;while(...

Linux客户端和Window服务器端udp socket通信不能成功
上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)另...

uniapp开发小程序兼容原生写的websocke吗?如果原生的可以用ws的吗?还是...
uniapp 开发的小程序,提供有websocket相关的API,使用你可以查阅官网的文档。本地测试可以使用ws,如果上线的话,则必须使用wss。

python udp发送数据的问题
如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。第3步,绑定后,必须准备好套接字,以便接受连接请求。socket.listen(backlog)backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。第4步,服务器套接字通过socket的accept方法等待客户请求一个...

十一、信令服务器原理
socket.io是一个基于Nodejs的库,在现有的Node Server上增加个socket.io即可 在任何终端都可以引入socket.io客户端的库,通过客户端的库就可以连接到 Nodejs中 socket.io服务器上 这样就可以建立连接,然后就可以创建,加入房间,这样房间内的人就可以通信了 多个 socke.io可以串行通信。

WSASend()的评述
如果同样缓存大小,而socke是阻塞的socket, WSASend将阻塞直到用户所有的数据被发送成功。Note socket配置项SO_RCVTIMEO and SO_SNDTIMEO只能被用于阻塞的sockets。lpBuffers这个参数是一个指针,它指向一个WSABUF结构的数组。这个数组可以是瞬态的(transient)。所谓瞬态的含义如下:如果这个操作时重叠的操作,...

我是名计算机专业的学生,目前主要学习C#,asp.net,现在想做些项目练习...
要练手我建议做一些特别有针对性的小问题,而不是做一个完整的项目。这些问题很多啦,后台的各种排序算法,多线程的使用,socke通信,串口通信,IO操作,数据库的添删改查,WCF分布式架构实现等。前台就是HTML布局,CSS,JS技巧。这些问题分开来联系,集中在一起容易顾此失彼,无法面面俱到。

高级java和java 区别?
·应用 Socke t 编写 TCP\/IP 客户端应用 ·为一个应用程序和体系结构选择最好的 Web 技术 ·编写 Java servle t ·将 Web 应用程序与 EJB 组件和数据库连接 ·实现应用程序管理技术,如安全性和线程化 ·编写 JSP 页 ·为 JSP 页创建定制的标签库 代码规范都是一样的 没有区别 ...

asp.net接收另一页面传来的数据用Querystring 方法,为什么页面一直是空 ...
EditPCtrl(sid.Substring(1));} } \/\/你就在LOAD中写接收就行了,如果写是if (!IsPostBack)就只能接一次,本页再回发就接不到了 看你补充出来的代码,你这样做 private void Button1_Click(object sender, EventArgs e){ if(ViewState["name"]==null){ ViewState.Add("name",TextBox1.Text)...

常熟市13523327441: 我用c++编写了个socket通信程序,为什么在局域网内没事而外网交流就有问题呢? -
皮新苯磺: 架墙了吧,用了哪些端口,看看端口是不是防火墙阻断了,你写的通信程序是应用层的,更协议没关系.主要看端口是不是被拒,可以用telnet ip 端口 的方式测试,telnet就是使用的socket连接,而且请使用固定IP访问

常熟市13523327441: socket通信到底如何加密?我自己写了一个socket的通信程序(用c写的),谁能指导下怎样加密吗? -
皮新苯磺: socket的通信 是以byte传输的,将其按一定规则转变简单的来说.比如奇数的字节,你+5 偶数的字符,-3,这样得到的就不是你原来的内容了.可以用可逆的加密算法,进行加密,接收后再解密.

常熟市13523327441: 单独写的一个socket服务应该怎么部署?部署到哪个平台 -
皮新苯磺: 应该是c/s程序吧,直接在服务器上调用java命令运行main类就行,就像我们开始学习java时需要手动编译运行一样,先javac编译,再java运行. 你把在你本地编译好的class文件,放到服务器,通过java main类路径 的方式后台运行就可以 .

常熟市13523327441: 为什么Java socket 连接慢,我写了一个socket通信程序和别的系统,进行同城通信,sokcet创建一个连接超过10 -
皮新苯磺: 首先你的网速会影响,对面的当然也会,一般的家用宽带受限太多,而且传输不稳定 还有socket的TCP协议只是一个基础协议,要想在传输的时候一般其他程序客户端都会进行再优化 以达到更好的效率 还有就是你的程序是不是写太繁杂了,最好也在优化下

常熟市13523327441: 我写了一个socket程序;出了一些问题,请看问题补充: -
皮新苯磺: 明显是服务器端有错误while (1) { len = sizeof(cliaddr); cfd = accept(sfd,(struct sockaddr *)&cliaddr,&len); i = read(cfd,str1,MAX); write(STDOUT_FILENO,str1,i); close(cfd); }服务器在接受了一个连接后,读了一段数据,然后打印,然后close这个socket,这样服务器就阻塞在accept中,而又没有客户端发起connect,这样服务器就一直阻塞正确的做法是将i = read(cfd,str1,MAX);write(STDOUT_FILENO,str1,i);放入一个循环

常熟市13523327441: 编写一Socket完成下面的功能(JAVA)
皮新苯磺: 要使用到数据库,将数据记录到数据库中,并对其访问... 若用数组或List,向量..实现起来简单但对于client server实现功能来说...不要用 还有,提问要加奖赏才会有人做...

常熟市13523327441: 用C写了个socket程序,但有时候write()函数返回Broken pipe错误,是怎么回事? -
皮新苯磺: 在linux的网络编程,特别是TCP的编程中,SIGPIPE信号错误是一个比较常见的问题,我猜测你是在使用TCP的socket吧,如果是这样的话,很有可能是你在向一个已经处于关闭状态的socket写数据,因为TCP是面向连接的协议.如果对方将socket给close掉了,而你还继续往这个 socket写数据,就会触发这个信号.因此,建议你在write之前检查一下对方是否已经close掉了这个socket.如果回答得不对,可以继续追问哈

常熟市13523327441: 用C++写了一个Window Socket的简单通讯软件,但就是无法联网~~求高手~~ -
皮新苯磺: 1、检查一下服务器有没有打开端口进行监听,客户端是否可以连接到这个端口,服务器有没有accept.具体的源码可以看飞鸽传书,它的聊天功能用udp,文件传输用tcp,代码有万把行,api,vc6.我自己几年前也实现了一个dll版本的,几千行,api,bcb的.要的话留下邮箱.2、如果是用控件实现的socket,免谈.3、可以参考《windows网络编程技术》或《windows网络编程》一书.

常熟市13523327441: java写的一个服务程序,跑在Linux上,功能是一个socket server,绑定了一个端口 -
皮新苯磺: public class UDPServer extends Thread{ public void run(){ //这里是一个线程池,多线程处理接收到得消息...

常熟市13523327441: 自己写了一个Android的APP,想用socket连接服务器 -
皮新苯磺: 最近我在在写一个APP,用到了socket,在自己电脑上搭建的服务器,具体过程: 用eclipse写Java代码,创建一个serversocket,用来监听客户端的请求; 客户端在发送数据前,首先创建一个Socket,然后直接请求服务器即可.自己写了一个Android的APP,想用socket连接服务器

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网