解决方案 »
- 晒一晒2011年,计算机科学与技术专业,毕业生的月薪
- 点击率问题
- getWebApplicationContext().getBean("xxx");
- 关于hibernate联级操作的问题(加急)
- Sturts 问题
- [log4j] log信息输出的问题
- hibernate 的奇怪问题,请教
- 求救!!为什么在struts中删除记录老是删除到最后一个
- JBuilder&WebLogic中的CMP查询问题
- 如何签名一个Applet,时之可以访问本地的资源?
- springMVC之helloworld出现问题啦~~帮忙看看咯~
- ehcache.xml异常。。。which is already used by an existing CacheManager.
ServerSocket server = null;
Socket client = null; public static void main(String[] args) {
new Server().sendAndRecv();
} public void sendAndRecv() {
try {
server = new ServerSocket(8003);
while (true) {
client = server.accept();
System.out.println(client.getInetAddress() + "已连接......");
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
int i = -1;
byte[] buf = new byte[1024];
i = is.read(buf);
System.out.println(new String(buf, 0, i));
System.out.println("信息已经读取完成.");
os.write("hello world!".getBytes());
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Client {
Socket client = null; public static void main(String[] args) {
new Client().sendAndRecv();
} public void sendAndRecv() {
try {
client = new Socket("127.0.0.1", 8003);
OutputStream os = client.getOutputStream();
os.write("zhangsan he li si is firend".getBytes());
os.flush();
int i = -1;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
InputStream is = client.getInputStream();
byte[] buf = new byte[is.available()];
i = is.read(buf);
System.out.println(new String(buf, 0, i));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
先说说你这个例子,其实你这个例子单回合是没有问题的,也就是Client第一次给Server发信息,Server是可以收到的,但是第二次它就收不到了,因为阻塞了。要解决这个问题,就是要收、发分离,不管是服务端还是客户端,都有两个线程(一个负责收的Socket,一个负责发的Socket),而不是像你现在这样在一个线程里用同一个Socket来处理收发(read是会阻塞的,说白了阻塞后,程序就停在那了,不会往下执行)。
你要让client端先说话,server端先接收。那么就要在server端先开输入流,让其处于阻塞状态,先去接收client端的信息。
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
就是把server端开流的这个顺序改成这样
单纯楼主的代码,size读到的是 0。可以让等待,直到不为零。
服务器端和客户端,在size=is.available()后,加上:
while(size==0)
{
size=is.available();
}
一直等到有数据。