A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.ccsu.xie.net;

import java.io.*;
import java.net.*;

public class TcpDemo {
        public static void main(String[] args) throws Exception {

                //建立服务器端服务
                ServerSocket ss = new ServerSocket(10000);
                new Thread(new StringFormat(ss)).start();
               
                //建立客户端Socket服务
                Socket socket = new Socket("127.0.0.1",10000);
                new Thread(new Writer(socket)).start();
               
               
               
        }

}


//服务端:用来接收数据并转换(小写变大写) 再传给客户端
class StringFormat implements Runnable{
        private ServerSocket ss = null;
        public StringFormat(ServerSocket ss){
                this.ss = ss;
        }
        @Override
        public void run() {
                /*
                 * 为什么放在whiel循环外面可以正常运行,
                 * Socket s=null;
                try {
                        s = ss.accept();
                } catch (Exception e) {
                        // TODO: handle exception
                }
               
                */
                while(true){
                        //放这里就不能正常运行了呢????????????????
                        Socket s=null;
                        try {
                                s = ss.accept();
                        } catch (Exception e) {
                                // TODO: handle exception
                        }
                        try {
                                System.out.println("服务器断正在等待数据.....");
                                System.out.println("Connected successed");
                                //获取输入流
                                InputStream is =s.getInputStream();
                                byte [] buf = new byte[1024];
                                int len = is.read(buf);
                                String info = new String(buf,0,len);
                                System.out.println("服务器端收到数据: "+info);
                                if("over".equals(info))
                                        break;
                                //获取输出流
                                OutputStream os = s.getOutputStream();
                                info ="Server: "+ info;
                                os.write(info.toUpperCase().getBytes());
                               
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
                try {
                        ss.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }       
        }       
}


//客户端:用来接收键盘输入数据,传给服务端,并接收服务端返回的信息
class Writer implements Runnable{
        private Socket socket=null;
        public Writer(Socket socket){
                this.socket = socket;
        }
        @Override
        public void run() {
                OutputStream os=null;
                InputStream is =null;
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                while(true){
                        System.out.println("请输入你想要转换的字符串");
                        String line = null;
                    try {
                                line = br.readLine();
                                System.out.println(line);
                                //获取socket输出流,并将键盘录入字符串发送到服务器端
                                os = socket.getOutputStream();
                                os.write(line.getBytes());
                                if("over".equals(line))
                                        break;
                                //获取socket输入流
                                is = socket.getInputStream();
                                byte [] sInfo = new byte[1024];
                                int len = is.read(sInfo);
                                System.out.println("客户端收到数据: "+new String(sInfo,0,len));
                                Thread.sleep(100);
                        } catch (Exception e) {
                                e.printStackTrace();
                               
                        }
                       
                }
                //关闭socket流对象s
                try {
                        socket.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        try{
                                br.close();
                        } catch (IOException e1) {
                                e1.printStackTrace();
                        }
                }
               
        }
       
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
为我没看到问题
回复 使用道具 举报
夏晓彤 发表于 2013-3-7 21:29
为我没看到问题

//放这里就不能正常运行了呢????????????????
                 Socket socket = ss.accept();

放在while循环里面客户端就只能传输一次数据,之后就好像死锁了.
回复 使用道具 举报
本帖最后由 张学林 于 2013-3-8 11:16 编辑

第46行有说明,我把客户端单独拿出来的,以便验证

  1. import java.io.*;
  2. import java.net.*;

  3. public class TcpDemo {
  4.         public static void main(String[] args) throws Exception {

  5.                 //建立服务器端服务
  6.                 ServerSocket ss = new ServerSocket(10000);
  7.                 new Thread(new StringFormat(ss)).start();
  8.                
  9.                 //建立客户端Socket服务
  10. //                Socket socket = new Socket("127.0.0.1",10000);
  11. //                new Thread(new Writer(socket)).start();
  12.                
  13.                
  14.                
  15.         }

  16. }


  17. //服务端:用来接收数据并转换(小写变大写) 再传给客户端
  18. class StringFormat implements Runnable{
  19.         private ServerSocket ss = null;
  20.         public StringFormat(ServerSocket ss){
  21.                 this.ss = ss;
  22.         }
  23.         @Override
  24.         public void run() {
  25. //                 Socket s=null;
  26. //                try {
  27. //                        s = ss.accept();
  28. //                } catch (Exception e) {
  29. //                        // TODO: handle exception
  30. //                }
  31. //               
  32.                
  33.                 while(true){
  34.                         //放这里就不能正常运行了呢????????????????
  35.                         Socket s=null;
  36.                         System.out.println("aaaaaaaaaaaafdsaf");
  37.                         try {
  38.                                 s = ss.accept();
  39.                                 System.out.println(s.getInetAddress().getHostAddress()+"...."+s.getPort());
  40.                                 //这句话可以验证,当你把它放在里面的时候,s = null会把你的客户端端口关闭s = ss.accpet( )会
  41.                                 //重新开个接收的端口
  42.                      } catch (Exception e) {
  43.                                 // TODO: handle exception
  44.                         }
  45.                         try {
  46.                                 System.out.println("服务器断正在等待数据.....");
  47.                                 
  48.                                 System.out.println(s.getInetAddress().getHostAddress()+"  Connected successed  "+s.getPort());
  49.                                 //获取输入流
  50.                                 InputStream is =s.getInputStream();
  51.                                 byte [] buf = new byte[1024];
  52.                                 int len = is.read(buf);
  53.                                 String info = new String(buf,0,len);
  54.                                 System.out.println("服务器端收到数据: "+info);
  55.                                 if("over".equals(info))
  56.                                         break;
  57.                                 //获取输出流
  58.                                 OutputStream os = s.getOutputStream();
  59.                                 info ="Server: "+ info;
  60.                                 os.write(info.toUpperCase().getBytes());
  61.                                 
  62.                         } catch (Exception e) {
  63.                                 e.printStackTrace();
  64.                         }
  65.                 }
  66.                 try {
  67.                         ss.close();
  68.                 } catch (IOException e) {
  69.                         e.printStackTrace();
  70.                 }        
  71.         }        
  72. }


  73. //客户端:用来接收键盘输入数据,传给服务端,并接收服务端返回的信息
  74. class Writer /*implements Runnable*/{
  75.         public static void main(String[] args) {
  76.                
  77.                 Socket socket=null;
  78.                 try {
  79.                         socket = new Socket("127.0.0.1",10000);
  80.                         System.out.println(socket.getPort()+"~~~~~~~~~~~~~~~~~");
  81.                 } catch (UnknownHostException e2) {
  82.                         // TODO Auto-generated catch block
  83.                         e2.printStackTrace();
  84.                 } catch (IOException e2) {
  85.                         // TODO Auto-generated catch block
  86.                         e2.printStackTrace();
  87.                 }
  88. //        private Socket socket=null;
  89. //        public Writer(Socket socket){
  90. //                this.socket = socket;
  91. //        }
  92. //        @Override
  93. //        public void run() {
  94.                 OutputStream os=null;
  95.                 InputStream is =null;
  96.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  97.                 while(true){
  98.                         System.out.println("请输入你想要转换的字符串");
  99.                         String line = null;
  100.                     try {
  101.                             System.out.println("333333333333333");
  102.                                 line = br.readLine();
  103. //                                System.out.println(line);
  104.                                 //获取socket输出流,并将键盘录入字符串发送到服务器端
  105.                                 os = socket.getOutputStream();
  106.                                 os.write(line.getBytes());
  107.                                 if("over".equals(line))
  108.                                         break;
  109.                                 //获取socket输入流
  110.                                 is = socket.getInputStream();
  111.                                 byte [] sInfo = new byte[1024];
  112.                                 int len = is.read(sInfo);
  113.                                 System.out.println("客户端收到数据: "+new String(sInfo,0,len));
  114.                                 Thread.sleep(100);
  115.                         } catch (Exception e) {
  116.                                 e.printStackTrace();
  117.                                 
  118.                         }
  119.                         
  120.                 }
  121.                 //关闭socket流对象s
  122.                 try {
  123.                         socket.close();
  124.                 } catch (IOException e) {
  125.                         // TODO Auto-generated catch block
  126.                         e.printStackTrace();
  127.                 }finally{
  128.                         try{
  129.                                 br.close();
  130.                         } catch (IOException e1) {
  131.                                 e1.printStackTrace();
  132.                         }
  133.                 }
  134.                
  135. //        }
  136.         
  137. }
  138. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
张学林 发表于 2013-3-8 11:13
第46行有说明,我把客户端单独拿出来的,以便验证

对啊。。每次连接都重新获取socket对象。。应该可以正常运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马