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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 744919632 中级黑马   /  2015-12-8 11:34  /  2904 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。

求大神帮忙完成,最好写上注释,我快崩溃了。

最佳答案

查看完整内容

毕老师视频里面有讲到类似的题目哟

9 个回复

倒序浏览
本帖最后由 Murphye 于 2015-12-8 22:25 编辑
  1. import java.io.*;
  2. import java.net.*;
  3. /*
  4. 需求:使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
  5.          服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。        
  6. */

  7. /*
  8. 客户端:
  9. 1. 需要先有socket端点。
  10. 2. 客户端的数据源:键盘。
  11. 3. 客户端的目的:socket。
  12. 4. 接收服务端的数据,源:socket。
  13. 5. 将数据显示再打印出来。目的:控制台。
  14. 6. 在这些流中操作的数据,都是文本数据。
  15. */
  16. class MyClient {
  17.         public static void main(String[] args)throws Exception{
  18.                 //创建客户端Socket服务
  19.                 Socket s = new Socket("127.0.0.1",10010);
  20.                 //获取键盘录入
  21.                 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
  22.                 //socket输出流
  23.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  24.                 //socket输入流,读取服务端返回的反转数据
  25.                 BufferedReader bfrIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  26.                
  27.                 //把键盘获取的数据发送出去,输入over时结束客户端
  28.                 String line = null;
  29.                 while((line=bfr.readLine())!=null){
  30.                         if("over".equals(line))
  31.                                 break;
  32.                         out.println(line);
  33.                         
  34.                         //读取服务器端返回的数据
  35.                         String turn = bfrIn.readLine();
  36.                         System.out.println(turn);
  37.                 }
  38.                 s.close();               
  39.         }        
  40. }
  41. /*
  42. 转换服务器
  43. 分析:
  44. 1. serversocket服务。
  45. 2. 获取socket对象。
  46. 3. 源:socket,读取客户端发过来需要转换的数据。
  47. 4. 目的:显示在控制台上。
  48. 5. 将数据转换顺序发给客户端。
  49. */
  50. class TransServer {

  51.         public static void main(String[] args)throws Exception {
  52.                 //创建ServerSocket               
  53.                 ServerSocket ss = new ServerSocket(10010);
  54.                
  55.                 //获取socket对象
  56.                 Socket s = ss.accept();
  57.                
  58.                  //获取客户端的ip,有客户端连接进来时提示
  59.                 String ip = s.getInetAddress().getHostAddress();
  60.                 System.out.println(ip+"....is connected");
  61.                
  62.                 //获取socket读取流,并用BufferedReader装饰
  63.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
  64.                
  65.                 //获取socket的输出流,用PrintWriter装饰,方便刷新数据
  66.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  67.                
  68.                 String line = null;
  69.                 while((line=bufr.readLine())!=null){
  70.                         System.out.println(line);
  71.                         
  72.                         //创建StringBuffer容器,使用它里面的reverse反转方法
  73.                         StringBuffer sb = new StringBuffer(line);                        
  74.                         out.println(sb.reverse());
  75.                 }
  76.                 s.close();
  77.                 ss.close();
  78.         }
  79. }
复制代码
毕老师视频里面有讲到类似的题目哟
回复 使用道具 举报

* 客户端*/

import java.io.*;

import java.net.*;

public class Test10_Client {

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

      Socket s = new Socket("192.168.0.103", 8080);// 创建Socket对象;

      BufferedReader buf = new BufferedReader(

            new InputStreamReader(System.in));// 从键盘获取输入流到缓冲区;

      BufferedWriter bufout=new BufferedWriter(newOutputStreamWriter(s.getOutputStream())

            );// 创建一个输出流

      BufferedReader bufIn = new BufferedReader(new InputStreamReader(

            s.getInputStream()));// 获取输入流……;

      String line = null;

      while ((line = buf.readLine()) != null) {

         if ("over".equals(line))

            break;

            bufout.write(line);

            bufout.newLine();

            bufout.flush();

            Stringstr=bufIn.readLine();

           System.out.print("server:"+str);

      }

      s.close();

   }

}

/**服务器端

*/import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class Test10_Server {

   public static void main(String []agrs)throws Exception

   {

      ServerSocket ss=new ServerSocket(8080);

       Socket s= ss.accept();

       String ip=s.getInetAddress().getHostAddress();

       System.out.println(ip+"we are connected!");

       BufferedReader buf =new BufferedReader(newInputStreamReader(s.getInputStream()));

       BufferedWriter bufout=newBufferedWriter(newOutputStreamWriter(s.getOutputStream())

            );// 创建一个输出流

      // bufout.write(ip+"we are connected!");

       String line=null;

       while((line=buf.readLine())!=null){

          System.out.println(line);

          StringBuffer re=new StringBuffer(line);//字符串反转处理

          Stringstr=re.reverse().toString();

          System.out.println(re+"++   ++"+str);//服务器本地输出

          bufout.write(str);//将字符反转并输出到客户端

          bufout.newLine();

          bufout.flush();

       }

    s.close();

  

   }

}

回复 使用道具 举报
ios学者 发表于 2015-12-8 11:44
* 客户端*/import java.io.*;import java.net.*; public class Test10_Client {   public static void mai ...

全是报错,我修改了一下,还有一个,public class Test10_Server报错的。
回复 使用道具 举报
ios学者 发表于 2015-12-8 11:44
* 客户端*/import java.io.*;import java.net.*; public class Test10_Client {   public static void mai ...

/**服务器端
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Test10_Cilent {
        public static void main(String[] args) throws Exception {
              Socket s = new Socket("192.168.0.103", 8080);// 创建Socket对象;
              BufferedReader buf = new BufferedReader(
                    new InputStreamReader(System.in));// 从键盘获取输入流到缓冲区;
              BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())
                    );// 创建一个输出流
              BufferedReader bufIn = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));// 获取输入流……;
              String line = null;
              while ((line = buf.readLine()) != null) {
                 if ("over".equals(line))
                    break;
                    bufout.write(line);
                    bufout.newLine();
                    bufout.flush();
                    String str=bufIn.readLine();
                   System.out.print("server:"+str);
              }
              s.close();
           }
        }
         class Test10_Server {
           public static void main(String []agrs)throws Exception
           {
              ServerSocket ss=new ServerSocket(8080);
               Socket s= ss.accept();
               String ip=s.getInetAddress().getHostAddress();
               System.out.println(ip+"we are connected!");
               BufferedReader buf =new BufferedReader(new InputStreamReader(s.getInputStream()));
               BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())
                    );// 创建一个输出流
              // bufout.write(ip+"we are connected!");
               String line=null;
               while((line=buf.readLine())!=null){
                  System.out.println(line);
                  StringBuffer re=new StringBuffer(line);//字符串反转处理
                  String str=re.reverse().toString();
                  System.out.println(re+"++   ++"+str);//服务器本地输出
                  bufout.write(str);//将字符反转并输出到客户端
                  bufout.newLine();
                  bufout.flush();
               }
            s.close();
          
           }

}


运行时候报错了。
回复 使用道具 举报
思路:
步骤:


*/
import java.io.*;
import java.net.*;
import java.util.Scanner;
class TcpServer//服务端
{
        public static void main(String[] args)throws Exception
        {
                Socket s=null;
                try{
                        while(true)
                        {
                                @SuppressWarnings("resource")
ServerSocket serverSocket=new ServerSocket(10001);
                                s=serverSocket.accept();
                                BufferedReader server_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                String str=server_buf.readLine();
                                System.out.println("服务端接受到数据...");
                                Thread.sleep(10000);
                                PrintStream pri=new PrintStream(s.getOutputStream());
                                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;
                try
                {
                        s=new Socket(InetAddress.getLocalHost(),10001);
                        while(true){
                                BufferedReader client_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                PrintStream pri=new PrintStream(s.getOutputStream());
                                Scanner 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());        
                                sc.close();
                        }
                }
                catch(Exception e)
                {
                                e.printStackTrace();
                }
                finally{
                        if(s!=null){
                                try{
                                        s.close();
                                }
                                catch(Exception e)
                                {
                                        e.printStackTrace();
                                }
                        }
                }        
        }
}
回复 使用道具 举报
思路:
步骤:


*/
import java.io.*;
import java.net.*;
import java.util.Scanner;
class TcpServer//服务端
{
        public static void main(String[] args)throws Exception
        {
                Socket s=null;
                try{
                        while(true)
                        {
                                @SuppressWarnings("resource")
ServerSocket serverSocket=new ServerSocket(10001);
                                s=serverSocket.accept();
                                BufferedReader server_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                String str=server_buf.readLine();
                                System.out.println("服务端接受到数据...");
                                Thread.sleep(10000);
                                PrintStream pri=new PrintStream(s.getOutputStream());
                                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;
                try
                {
                        s=new Socket(InetAddress.getLocalHost(),10001);
                        while(true){
                                BufferedReader client_buf=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                PrintStream pri=new PrintStream(s.getOutputStream());
                                Scanner 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());        
                                sc.close();
                        }
                }
                catch(Exception e)
                {
                                e.printStackTrace();
                }
                finally{
                        if(s!=null){
                                try{
                                        s.close();
                                }
                                catch(Exception e)
                                {
                                        e.printStackTrace();
                                }
                        }
                }        
        }
}
回复 使用道具 举报

大哥,这代码你直接粘过来的吧,我看过了,也是错。
回复 使用道具 举报
  1. /**
  2. * 步骤:第一步:创建客户端--(得到键盘输入-发送数据-获得服务端反馈-输出结果)
  3. *                  第二步:创建服务端---通过服务端accept()方法,获得输入输出流,进行数据操作(获得-反转-输出)
  4. * 因为只需要读取一个字符串,客户端只读一次就关闭流,只输出一次就关闭客户端输出流
  5. * @author Administrator
  6. *---测试类
  7. */
  8. import java.net.*;
  9. import java.io.*;
  10. import java.util.*;
  11. public class ReverseString{
  12.         //主线程
  13.         public static void main(String[] args) {
  14.                 new Thread(new TcpServer()).start();//对于TCP协议,首先建立服务端线程
  15.                 new Thread(new TcpClient()).start();//其次建立客户端线程
  16.         }
  17. }
  18. /**
  19. * 客户端
  20. * @author Administrator
  21. *
  22. */
  23. class TcpClient implements Runnable{
  24.         public void run(){//客户端线程run方法
  25.                 Socket s=null;
  26.                 BufferedReader isw=null;
  27.                 try {
  28.                         isw=new BufferedReader(new InputStreamReader(System.in));//键盘输入流
  29.                         String str=isw.readLine();//获得键盘录入
  30.                         s=new Socket(InetAddress.getLocalHost(),11112);//客户端
  31.                         BufferedWriter bufw=//客户端输出流
  32.                                         new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  33.                         bufw.write(str);
  34.                         bufw.flush();//输出并刷新流
  35.                         s.shutdownOutput();//关闭输出流
  36.                         BufferedReader bufr=//客户端输入流,读取服务端反馈的信息
  37.                                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  38.                         String backInfo=bufr.readLine();
  39.                         System.out.println("客户端:反转后为:"+backInfo);//输出反馈信息
  40.                 } catch (UnknownHostException e) {
  41.                         // TODO Auto-generated catch block
  42.                         System.out.println("主机有误");
  43.                 } catch (IOException e) {
  44.                         // TODO Auto-generated catch block
  45.                         System.out.println("流读写异常");
  46.                 }finally{//关闭资源
  47.                         if(s!=null&&isw!=null)
  48.                         try {
  49.                                 s.close();
  50.                                 isw.close();
  51.                         } catch (IOException e) {
  52.                                 // TODO Auto-generated catch block
  53.                                 System.out.println("客户端关闭失败");
  54.                         }
  55.                 }
  56.         }
  57. }
  58. /**
  59. * TCP服务端
  60. * @author Administrator
  61. *
  62. */
  63. class TcpServer implements Runnable{
  64.         public void run(){//服务端线程run方法
  65.                 ServerSocket ss=null;
  66.                 Socket s=null;
  67.                 try {
  68.                         ss=new ServerSocket(11112);//监听的应用程序--端口
  69.                         s=ss.accept();//从服务端获得该服务端监听的客户端
  70.                         BufferedReader bufr=//服务端输入流
  71.                                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  72.                         String getInfo=bufr.readLine();
  73.                         if(getInfo!=null){//如果获得的客户端数据不为null,则反转该字符串
  74.                                 StringBuilder sb=new StringBuilder(getInfo);
  75.                                 getInfo=sb.reverse().toString();//反转
  76.                         }
  77.                         if(getInfo==null)//如果为空
  78.                                 getInfo="什么都没有呀";
  79.                         PrintWriter pw=new PrintWriter(s.getOutputStream());//服务端输出流
  80.                         pw.println(getInfo);//换行输出,客户端才能接收数据
  81.                         pw.flush();//刷新
  82.                 } catch (IOException e) {
  83.                         // TODO Auto-generated catch block
  84.                         System.out.println("服务端错误!");
  85.                 }finally{//关闭资源
  86.                         if(ss!=null&&s!=null){
  87.                                 try {
  88.                                         s.close();
  89.                                         ss.close();
  90.                                 } catch (IOException e) {
  91.                                         // TODO Auto-generated catch block
  92.                                         System.out.println("服务端关闭失败");
  93.                                 }
  94.                                
  95.                         }
  96.                 }
  97.         }
  98. }
复制代码

毕老师视频里面说的也很详细
回复 使用道具 举报
Murphye 发表于 2015-12-8 22:14
毕老师视频里面有讲到类似的题目哟

OK  好的,完美解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马