问题描述:发生互相等待。烦请大虾们指教,感激不尽!服务器端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(8899);
while(true) {
Socket s=ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(clientStr!=null) {
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
br.close();
dos.close();
s.close();
}
}
}客户端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket("localhost",8899);
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr=null;
while((serverStr=br.readLine())!=null) {
System.out.println("server: "+serverStr);
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
编译通过运行 >java net.TCPServer
运行 >java net.TCPClient
在服务器端输入:hello
结果客户端和服务器端互相等待。仔细检查了两个程序,小弟眼拙,没有发现出现死锁的地方,请哪位帮忙看一下,谢谢了
package net;import java.net.*;
import java.io.*;public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(8899);
while(true) {
Socket s=ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(clientStr!=null) {
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
br.close();
dos.close();
s.close();
}
}
}客户端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket("localhost",8899);
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr=null;
while((serverStr=br.readLine())!=null) {
System.out.println("server: "+serverStr);
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
编译通过运行 >java net.TCPServer
运行 >java net.TCPClient
在服务器端输入:hello
结果客户端和服务器端互相等待。仔细检查了两个程序,小弟眼拙,没有发现出现死锁的地方,请哪位帮忙看一下,谢谢了
解决方案 »
- String 字符串处理
- hashcode(),equals() 到底是什么关系,各表示什么意思, 看了很多介绍,越看越迷茫,请高人解惑
- 如何实现线程之间共享一个变量。
- 刚刚发错版面了,谁帮忙看看两个字符串处理的问题,在线等谢谢
- 请教:jdbc怎么判断update的记录数?
- 请教算法复杂度
- 线程同步问题,不知道如何处理。各位大虾帮忙看一下
- 能否简要说明一下Hashtable类和它的getRules函数的作用及用法
- 请问如何用jni类来调用一个非java写的外部exe?谢谢!
- List有没有这样的功能?(送分问题)
- 最近想做个游戏,谁能指点下如何处理键盘事件的问题,谢谢了!(使用全部家当啦~)
- 数据库中如何比较datetime类型中的大小
楼主【apple_pie】截止到2008-07-07 22:29:32的历史汇总数据(不包括此帖):
发帖的总数量:1 发帖的总分数:20
结贴的总数量:1 结贴的总分数:20
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
服务器端程序:
import java.io.*; public class TCPServer {
public static void main(String[] args) throws IOException {
//将套接字的创建等工作放在循环的外面。
ServerSocket ss=new ServerSocket(8899);
Socket s=ss.accept();
//这个流改成PrintWriter
PrintWriter dos = new PrintWriter(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(true) {
dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
//流的关闭也放在循环的外面。
br.close();
dos.close();
s.close();
}
}
客户端程序:
package net; import java.net.*;
import java.io.*; public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket(InetAddress.getLocalHost(),8899);
//这个流改成PrintWriter
PrintWriter dos=new PrintWriter(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr="Start";
//while((serverStr=br.readLine())!=null) {
while(true){
serverStr=br.readLine();
System.out.println("server: "+serverStr);
dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
把DataOutputStream 该成PrintWriter 就可以了。
我想问题可能出在输入和输出流一个是基于字符另一个是基于字节,不匹配的原因吧。
有没有高手能解释一下?
server使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine())写出的流中不包含行结束符号'\r',所以client使用serverStr=br.readLine()从输入流中读时会一致等待;同样client发送消息时也是这个原因导致server在等待。
可以使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine()+ "\r")在写出去的流中添加一个换行符,client和server就可以工作了,不过我测试了编码有点乱,输入bye并不结束。
不是没有flush的原因.缓冲区已经被刷新了.也就是说,数据已经发送给对方的.
但是,接收方,调用的readLine方法.该方法是阻塞读的.如果没有读到换行符,那就一直阻塞.
出现相互等待的状况.
楼主有兴趣,可以试着,在dos.flush();方法前边,加一个dos.write("\n");应该可以解决该问题.注意,你的那个readLine方法.读入的数据,其实是没有换行符的.呵呵.
import java.io.*;
import java.net.*;
public class Client{
public static void main(String args[]){
Client c1=new Client();
try{
c1.client();
}catch(Exception e){
System.out.println("异常");
}
}
public void client() {
Socket s=null;
DataInputStream is=null;
DataOutputStream os=null;
try{
s=new Socket("10.5.7.82",2008);
is=new DataInputStream(s.getInputStream());
os=new DataOutputStream(s.getOutputStream());
//Client c=new Client();
os.writeUTF("this is client");
//System.out.println(a);
String a=is.readUTF();
System.out.println(a);
}catch(IOException e){
System.out.println("有异常");
}finally{
try{
s.close();
is.close();
os.close();
}catch(IOException e){
System.out.println("流没有关闭");
}
}
}
}
import java.net.*;
import java.io.*;
public class Server{
public static void main(String args[]){
Sever s1=new Sever();
try{
s1.sever();
}catch(Exception e){
System.out.println("服务器异常");
}
}
public void sever() {
ServerSocket ss=null;
Socket ss1=null;
DataInputStream is=null;
DataOutputStream os=null;
try{
ss=new ServerSocket(2008);
ss1=(ss.accept());
is=new DataInputStream(ss1.getInputStream());
os=new DataOutputStream(ss1.getOutputStream());
// Sever se=new Sever();
String a=is.readUTF();
System.out.println(a);
os.writeUTF("this server ok");
// System.out.println(b);
}catch(IOException e){
System.out.println("异常");
}finally{
try{
ss.close();
ss1.close();
is.close();
os.close();
}catch(IOException e){
System.out.println("关闭异常");
}
}
}
}