初学socket,客户端不能接收到服务端的消息

thksum 2009-12-30 05:35:32
程序的功能:客户端连接服务端后向服务端发送一段符,服务端收到后向客户端回一段字符。
但是服务端能够收到客户端的消息,而客户端一直阻塞在is.readLine(),不能接收到服务端的消息。


客户端代码

Socket socket = new Socket("192.168.101.112", 10880);
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

os.write("xxxx");
os.flush();
System.out.println("Server:" + is.readLine());


服务端:

BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
System.out.println("Client:"+is.readLine());
os.write("xxxx");
os.flush();
...全文
621 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaojiubo 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 thksum 的回复:]
不好意思18L,结帖的时候没有看到你的回帖
[/Quote]


没事,能解决问题就好
thksum 2009-12-31
  • 打赏
  • 举报
回复
不好意思18L,结帖的时候没有看到你的回帖
thksum 2009-12-31
  • 打赏
  • 举报
回复
谢谢楼上回答,不过已经结帖不能给分了
深山老叔 2009-12-31
  • 打赏
  • 举报
回复
客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClientB {
public static void main(String[] args) {
Socket s=null;
BufferedReader br=null;
PrintWriter pw=null;
try {
s=new Socket("127.0.0.1",8888);
BufferedReader brin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("please input your words:");
String str=brin.readLine();

pw=new PrintWriter(s.getOutputStream());
pw.println(str);
pw.flush();

br=new BufferedReader(new InputStreamReader(s.getInputStream()));
str=br.readLine();
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}finally{
if(br!=null)try{br.close();}catch(IOException e){}
if(s!=null)try{s.close();}catch(IOException e){}
}

}

}



服务端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerB {
public static void main(String[] args) {
ServerSocket ss=null;
Socket s=null;
PrintWriter pw=null;
BufferedReader br=null;
try {
ss=new ServerSocket(8888);
System.out.println("Server was Running on port 8888...");
int i=0;
while (true) {
s = ss.accept();
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=br.readLine();
i++;
System.out.println("第"+i+"个访问者:"+s.getInetAddress()+":"+str);
pw = new PrintWriter(s.getOutputStream());
pw.println("您是第"+i+"位访问者:" + str.toUpperCase());
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(pw!=null) pw.close();
if(br!=null)try{br.close();}catch(IOException e){}
if(s!=null)try{s.close();}catch(IOException e){}
if(ss!=null)try{ss.close();}catch(IOException e){}
}
}
}



实现客户端输入字符后,经过服务端处理大小写转换后发送回客户端
thksum 2009-12-31
  • 打赏
  • 举报
回复
。。。。。。。
明白了
os.write("xxxx")改成os.println("xxx")就可以了..........

谢谢大家的解答
zhaojiubo 2009-12-31
  • 打赏
  • 举报
回复
LZ用完那些流还有socket的时候要记得关闭,
比如:
os.close();
is.close();
socket.close();
Server .close();等等有的都要关闭
还有你把你所有的:os.write("xxxx");这个方法换成os.println("xxxx");
试试
thksum 2009-12-31
  • 打赏
  • 举报
回复
糊涂了...
能不能贴一个正确的例子:客户端向服务端发送一串字符,服务端立刻返回一串字符
thksum 2009-12-31
  • 打赏
  • 举报
回复
刚才有事出去了,希望大家还在
13L
我先在服务器这边键盘输入一行数据,但是也执行不下去啊

14L
我明白is.readLine()会阻塞,while的方式也看到过,但是现在连最简单的过程都执行不下去...

还是说回最早的代码吧:

客户端
Socket socket = new Socket("192.168.101.112", 10880);
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

os.write("xxxx");
os.flush();
System.out.println("Server:" + is.readLine());

服务端:
BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
System.out.println("Client:"+is.readLine());
os.write("xxxx");
os.flush();

为什么服务端执行到is.readLine(),始终读不出数据....
wangkun628988 2009-12-31
  • 打赏
  • 举报
回复
StringBuffer sb = new StringBuffer();
String line = null;
while (((line = br.readLine()) != null)) {
sb.append(line);
}
gongyi0929 2009-12-31
  • 打赏
  • 举报
回复
isreadline()方法是会阻塞的,要碰到换行的情况才会执行下面的语句
你完全可以把isreadline()放到while中去判断,这样,只有每次在点击回车时才会执行这个方法
xiesisi3 2009-12-31
  • 打赏
  • 举报
回复
你一定要搞清楚你的逻辑。你最后发的这个客户端,逻辑是:
1、从键盘读一行数据
2、将数据从socket输出流中写出去
3、从键盘读一行数据
4、从socket输入流中读一行数据

而服务器,逻辑是:
1、从键盘读一行数据
2、从socket输入流中读一行数据
3、写一行数据到socket输出流

那么现在如果你想执行成功,只能这样(因为所有的读写方法都是阻塞式的)
先在服务器这边键盘输入一行数据,然后服务器就会阻塞在line = is.readLine()这
那么只要在客户端那边键盘输入一行数据,那么客户端就会前进到第二步,也就会将数据写到服务器这边。这样服务器这边就会打印出Client:***

你的逻辑比较混乱,还没搞清楚。
其实应该一步一步来,比如说这样:
1、客户端从键盘接收一行数据。
2、客户端将接收到的数据写出。
3、服务器接收从客户端写过来的数据。
4、服务器打印该数据。

这样就完成最简单最简单的一个通信了。
thksum 2009-12-31
  • 打赏
  • 举报
回复
这样修改也不行啊...

客户端
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("192.168.101.112", 10880);
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));

System.out.println("Client input:");
String line = sin.readLine();
os.write(line);
os.flush();
System.out.println("Client input2:");
sin.readLine();
line = is.readLine();
System.out.println("Server:" + line);
} catch (Exception e) {
e.printStackTrace();
}
}
}

服务端

import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
ServerSocket Server = null;
try {
Server = new ServerSocket(10880);
} catch (Exception e) {
e.printStackTrace();
return;
}
Socket socket = null;
try {
socket = Server.accept();
} catch (Exception e) {
e.printStackTrace();
return;
}

try {
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("Server input:");
String line = sin.readLine();
line = is.readLine();
System.out.println("Client:"+line);
os.write("xxxx");
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
thksum 2009-12-31
  • 打赏
  • 举报
回复
8L谢谢你的资料,不过我想还是把最基础的问题弄清楚了才行。

9L你注意看我的代码:
1、服务端accept之后立刻is.readLine()等待客户端的消息
2、而客户端连接上了之后,会等待控制台的输入一串字符。
3、客户端获得输入之后,会通过过socket发送给服务端,然后立刻调用is.readLine()等待服务端返回
4、服务端接收到客户端的消息,就立刻返回一串字符给客户端

结果到了第3步就走不下去了

看了你的回复后,我试过修改代码,在第3步:
3、客户端获得输入之后,会通过过socket发送给服务端,然后等待控制台的输入流
4、服务端接收到客户端的消息,就立刻返回一串字符给客户端
5、客户端获得控制台输入后,再调用is.readLine()以获取服务端的返回消息
但结果也一样,服务端收不到客户端消息,客户端也收不到服务端的返回
javahuazai 2009-12-31
  • 打赏
  • 举报
回复

String line = is.readLine();

会阻塞在此处。顶9楼的。
xiesisi3 2009-12-31
  • 打赏
  • 举报
回复
这个当然啊,你自己的代码写的就是这样的,服务器端和客户端都阻塞在了
String line = is.readLine(); 

你自己也知道原因,那么改一下就好了啊,如果你只是想测试通信能不能成功,就把一边改成写,一边改成读就可以了,如果你想进行正常的通信,就要通过起线程来完成。
hzhxxx 2009-12-31
  • 打赏
  • 举报
回复

建议你看看这个,应该对你网络便成有很好的帮助
http://code.google.com/p/java-nsp/
thksum 2009-12-31
  • 打赏
  • 举报
回复
晕,少打了一个字:都打印不出消息了

怎么不能修改帖子了....
thksum 2009-12-31
  • 打赏
  • 举报
回复
谢谢大家关注,我整理了一下代码,结果现在无论是客户端还是服务端都打印出消息了,都一直阻塞在is.readLine()...

客户端:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("192.168.101.112", 10880);
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
String line = sin.readLine();
os.write(line);
os.flush();
line = is.readLine();
System.out.println("Server:" + line);
} catch (Exception e) {
e.printStackTrace();
}
}
}

服务端:
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
ServerSocket Server = null;
try {
Server = new ServerSocket(10880);
} catch (Exception e) {
e.printStackTrace();
return;
}
Socket socket = null;
try {
socket = Server.accept();
} catch (Exception e) {
e.printStackTrace();
return;
}
try {
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
String line = is.readLine();
System.out.println("Client:"+line);
os.write("xxxx");
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
teemai 2009-12-30
  • 打赏
  • 举报
回复
单看这段代码没什么错误,把代码全贴出来吧。
crazylaa 2009-12-30
  • 打赏
  • 举报
回复
代码不全,无真相
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧