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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我写了一个socket server的程序 为啥客户端只能运行一次,而且数据也传不到客户端相关的知识,希望对你有一定的参考价值。

是服务器端接收不到数据,不是客户端

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、工作定律

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

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

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

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

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

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

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

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

少劳多得定律:一般的单位,都分为合同工、(过去称为正式工)协议工、临时工等等。拿钱越少的工作量越大,而且越容易被解雇;拿钱越多的越没有多少事情可干,而且最不容易被解雇。
参考技术A 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
参考技术B 最可能就是你server端就能连接一次,s.accept();是阻塞式方式,当得到一个连接后就往后运行,不能再接收客户端连接了追问

那我们怎样做才能解决这个问题呢...小弟是菜鸟,请说清楚点,谢谢~-~啦

本回答被提问者采纳
参考技术C 数据匹配上有问题,可以自己定义一个规则,再运行。

Socket编程,为啥客户端无法接收来自服务器的数据?

参考技术A 如题,我写了段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) Clientimport 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()又一直在那读取,所以就阻塞了!本回答被提问者采纳

以上是关于我写了一个socket server的程序 为啥客户端只能运行一次,而且数据也传不到客户端的主要内容,如果未能解决你的问题,请参考以下文章

我写了一个winform程序 怎么让两个客户端之间通信

oracle 并行查询为啥只有一个进程在读。 我写了一个查询语句在里面些了个 /*+ parallel .....*/

为啥 sys socket recv 函数不填充数据但返回字节长度?

各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read

java socket多线程问题,我写了一个socket tcp服务端,高手来进来看下,谢啦。是关于多客户端并联的问题

PHP中为啥我获取不到$_SERVER["REMOTE_USER"]的值?