黑马程序员技术交流社区

标题: 大家帮看看我做的TCP简单通信 总是运行不出来 拜求问题 [打印本页]

作者: 宗士为    时间: 2012-5-18 19:30
标题: 大家帮看看我做的TCP简单通信 总是运行不出来 拜求问题
刚做了个简单的TCP
先说下需求吧:
//通过客户端键盘录入单词,并发送到服务端。//服务端在控制台打印后,将该单词转成大写再发回客户端。
检查了好多遍了 不知哪里出错 】
导致客户端输入的不能在服务端转成大写还给客户端
public class ClientDemo {

        public static void main(String[] args) throws Exception, IOException {
//                创建Socket对象  给服务端的ip 和  端口号
                Socket socket = new Socket("10.1.31.66", 10123);
//                获取输入流
                InputStream in = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int a = in.read(buffer);
                System.out.println(new String(buffer,0,a));
//                获取输出流
                OutputStream out = socket.getOutputStream();
                InputStream i  = System.in;
                byte[] buff = new byte[1024];
                int b = i.read(buff);
                out.write(buff, 0, b);
        }
}



public class ServerDemo {

        public static void main(String[] args) throws Exception {
//                创建TCP的端口并监听
                ServerSocket server = new ServerSocket(10123);
//                获得客服对象
                Socket socket1 = server.accept();
//                获得客服对象ip
                String ip = server.getInetAddress().getHostAddress();
                System.out.println(ip + "-------ing");
//                获得对象的输入流
                while(true) {
                        InputStream in = socket1.getInputStream();
                        byte[]buffer = new byte[1024];
                        int b = in.read(buffer);
                        System.out.println(new String(buffer,0,b));
        //                获得对象的输出流
                        OutputStream out = socket1.getOutputStream();
                        byte[]buff = (new String(buffer,0,b).toUpperCase()).getBytes();
                        out.write(buffer);
                }
               

        }

}



作者: 李保成    时间: 2012-5-18 19:45
初步猜想是这样,socket通讯它是阻塞式方式,如果服务器端没有接受到特殊字符的结束标记,它会默认为还在写入,那么这时候它一直在等待,而客户端那边也同样在等待返回数据,这样两端等待造成了一个假死的现象。毕导的视频里应该提到过,建议仔细看一下。谢谢、
作者: 宗士为    时间: 2012-5-18 20:02
踩单车的幸福 发表于 2012-5-18 19:45
初步猜想是这样,socket通讯它是阻塞式方式,如果服务器端没有接受到特殊字符的结束标记,它会默认为还在写 ...

我在客服端那边System。in输入同样的没反应
作者: 李保成    时间: 2012-5-18 20:04
确定一下,服务器打开了吗?你的客户端连接的10.1.31.66是你本机的IP地址吗
作者: 赵孟恩    时间: 2012-5-18 20:04
public class ClientDemo {

        public static void main(String[] args) throws Exception, IOException {
//                创建Socket对象  给服务端的ip 和  端口号
                 Socket socket = new Socket("10.1.31.66", 10123);
//                获取输入流
                 InputStream in = socket.getInputStream();
                 byte[] buffer = new byte[1024];
                 int a = in.read(buffer);                  //你这里顺序不对 read是阻塞式方法,在这直接阻塞等这从服务端接收数据,就往下不运行了,先向服务端发送在接收
                 System.out.println(new String(buffer,0,a));
//                获取输出流
                 OutputStream out = socket.getOutputStream();
                 InputStream i  = System.in;
                 byte[] buff = new byte[1024];
                 int b = i.read(buff);
                 out.write(buff, 0, b);
         }
}



public class ServerDemo {

        public static void main(String[] args) throws Exception {
//                创建TCP的端口并监听
                 ServerSocket server = new ServerSocket(10123);
//                获得客服对象
                 Socket socket1 = server.accept();
//                获得客服对象ip
                 String ip = server.getInetAddress().getHostAddress();
                 System.out.println(ip + "-------ing");
//                获得对象的输入流
                 while(true) {
                         InputStream in = socket1.getInputStream();
                         byte[]buffer = new byte[1024];
                         int b = in.read(buffer);
                         System.out.println(new String(buffer,0,b));
         //                获得对象的输出流
                         OutputStream out = socket1.getOutputStream();
                         byte[]buff = (new String(buffer,0,b).toUpperCase()).getBytes();
                         out.write(buffer);           //这里应该是buff
                 }
                //你这客户端只发送一次就结束了,而你这服务端却一直在这从这流接收数据,会报错的, 建议再仔细看看毕老师的视频

        }

}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2