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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. /**

  2. 10、 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
  3. 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
  4. @author

  5. 思路:
  6. 步骤:

  7. */
  8. import java.io.*;
  9. import java.net.*;
  10. import java.util.Scanner;
  11. class TcpServer//服务端
  12. {
  13.         public static void main(String[] args)throws Exception
  14.         {
  15.                 Socket s=null;
  16.                 try{
  17.                         while(true)
  18.                         {
  19.                                 ServerSocket serverSocket=new ServerSocket(10001);
  20.                                 s=serverSocket.accept();
  21.                                 BufferedReader server_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
  22.                                 String str=server_buf.readLine();
  23.                                 System.out.println("服务端接受到数据...");
  24.                                 Thread.sleep(10000);
  25.                                 PrintStream pri=new PrintStream(s.getOutputStream());
  26.                                 System.out.println("服务端将字符串反转后发送给客户端...");
  27.                                 pri.println(new StringBuffer(str).reverse());//将反转后的字符串打印到客户端屏幕上
  28.                         }
  29.                 }
  30.                 catch(Exception e)
  31.                 {
  32.                         e.printStackTrace();
  33.                 }
  34.                 finally{
  35.                         if(s!=null){
  36.                                 try{
  37.                                         s.close();
  38.                                 }
  39.                                 catch(Exception e)
  40.                                 {
  41.                                         e.printStackTrace();
  42.                                 }
  43.                         }
  44.                 }
  45.         }
  46. }

  47. class TcpClient//客户端
  48. {
  49.         public static void main(String[] args)throws Exception
  50.         {
  51.                 Socket s=null;
  52.                 try
  53.                 {
  54.                         s=new Socket(InetAddress.getLocalHost(),10001);
  55.                         while(true){
  56.                                 BufferedReader client_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
  57.                                 PrintStream pri=new PrintStream(s.getOutputStream());
  58.                                 Scanner sc=new Scanner(System.in);
  59.                                 System.out.println("请输入一个字符串:");
  60.                                 String str=sc.nextLine();
  61.                                 System.out.println("正在向服务器发送数据...");
  62.                                 pri.println(str);
  63.                                 System.out.println("接受来自服务器反转的字符串...");
  64.                                 System.out.println(client_buf.readLine());       
  65.                                 sc.close();
  66.                         }
  67.                 }
  68.                 catch(Exception e)
  69.                 {
  70.                                 e.printStackTrace();
  71.                 }
  72.                 finally{
  73.                         if(s!=null){
  74.                                 try{
  75.                                         s.close();
  76.                                 }
  77.                                 catch(Exception e)
  78.                                 {
  79.                                         e.printStackTrace();
  80.                                 }
  81.                         }
  82.                 }       
  83.         }
  84. }
复制代码
运行结果是这样的:


求大神解决这是什么错误?
只能完成一次字符串的发送和接受,我写的死循环,可是运行一次后就抛异常了。求解决!

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

8 个回复

倒序浏览
服务端
ServerSocket serverSocket=new ServerSocket(10001);
放在while 外面 只须建立 一次连接即可。
回复 使用道具 举报
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class TcpServer1// 服务端
{
        public static void main(String[] args) throws Exception {
                //這兩個都放在外面,
                ServerSocket serverSocket = new ServerSocket(10001);
                Socket s = serverSocket.accept();//客服端一直和服务器通信 连接一次就够了
                try {
                        while (true) {

                                BufferedReader server_buf = new BufferedReader(
                                                new InputStreamReader(s.getInputStream()));
                                String str = server_buf.readLine();
                                System.out.println("服务端接受到数据...");
                                Thread.sleep(2000);
                                PrintStream pri = new PrintStream(s.getOutputStream(), true);
                                System.out.println("服务端将字符串反转后发送给客户端...");
                                pri.println(new StringBuffer(str).reverse());// 将反转后的字符串打印到客户端屏幕上
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        if (s != null) {
                                try {
                                        s.close();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }
}

class TcpClient// 客户端
{
        public static void main(String[] args) throws Exception {
                Socket s = null;
                BufferedReader client_buf = null;
                PrintStream pri = null;
                Scanner sc = null;
                try {
                        s = new Socket(InetAddress.getLocalHost(), 10001);
                        while (true) {
                                client_buf = new BufferedReader(new InputStreamReader(
                                                s.getInputStream()));
                                 pri = new PrintStream(s.getOutputStream(), true);
                                 sc = new Scanner(System.in);
                                 System.out.println("请输入一个字符串:");
                                 String str = sc.nextLine();
                                        System.out.println("正在向服务器发送数据...");
                                        pri.println(str);
                                System.out.println("接受来自服务器反转的字符串...");
                                System.out.println(client_buf.readLine());
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        if (s != null) {
                                try {
                                        s.close();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }
}
//声明最好都方法try{} 或循环的外面 这个是我的习惯
回复 使用道具 举报
向阳泪无痕 发表于 2014-4-16 21:28
服务端
ServerSocket serverSocket=new ServerSocket(10001);
放在while 外面 只须建立 一次连接即可。

原来如此!
回复 使用道具 举报
多一点 发表于 2014-4-16 21:46
import java.io.*;
import java.net.*;
import java.util.Scanner;

可以放在try{}里面 不能放在while里面!谢谢我改了下就可以了!
回复 使用道具 举报
向阳泪无痕 发表于 2014-4-16 21:28
服务端
ServerSocket serverSocket=new ServerSocket(10001);
放在while 外面 只须建立 一次连接即可。

大神啊,还是感觉这样好多了!
回复 使用道具 举报
给顶了,都是大神
回复 使用道具 举报
感谢大神分享
回复 使用道具 举报
好牛!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马