java网络编程

本文详细介绍了如何使用Java实现Socket编程的服务器端和客户端,包括启动服务器、接收客户端连接请求、读取和发送数据。同时,还展示了回声服务器的实现,通过多线程处理多个客户端连接,并实现与客户端的I/O通信,完成数据的回显功能。
摘要由CSDN通过智能技术生成

服务器端:

//这个类用来表示Socket编程的服务器端:接收客户端的请求和给客户端做出响应

//1,启动服务器

//2,接收客户端的连接请求

//3,接收客户端发来的数据

public class Server {

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

       // 1,启动服务器,并且在8000端口,等待客户端连接

       ServerSocket server = new ServerSocket(8000);

       // 2,接收客户端的连接请求,并建立数据通信通道

       Socket socket = server.accept();

      

       // 3,获取到读取流,读取客户端发来的数据

       InputStream in = socket.getInputStream();

       //从读取流中,获取发来的hello,需要读取5次

       for (int i = 0; i < 5; i++) {

//         int b = in.read();//这样子读取是把字符转成数字了

           char c = (char)in.read();//为了直接读取字符

           System.out.print(c);//同行展示

       }

      

       //5,给客户端发送数据

       OutputStream out = socket.getOutputStream();

       out.write("world".getBytes());

       out.flush();

      

       //4,释放资源

       in.close();

       server.close();

    }

}

客户端:

//这个类用来表示Socket编程的客户端:接收服务器发来的数据和给服务器发送数据

//1,指定要连接的服务器

//2,给服务器发送hello

public class Client {

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

       // 1,指定要连接的服务器,并同时指定服务器的ip地址(如果是本机ip地址是固定值,如下)和端口号

       Socket socket = new Socket("127.0.0.1",8000);

      

       // 2,获取到输出流,并给服务器发送hello

       OutputStream out = socket.getOutputStream();

      

       //把hello字符串变成字节数组byte[]进行写出

       out.write("hello".getBytes());

       out.flush();//把数据刷出去,但是不关流

      

       //4,读取从服务器发回来的数据

       InputStream in = socket.getInputStream();

       for (int i = 0; i < 5; i++) {

//         int b = in.read();

           //一个一个读取流中的字符

           char b = (char)in.read();

           System.out.print(b);//同行展示

       }

      

       //3,释放资源

       in.close();

       socket.close();

    }

}

回声案例:

服务器端:
//这个类用来做回声案例的服务器端

//1,启动服务器

//2,接收客户端的连接请求

//3,给每个客户端分配对应的话务员

//4,话务员:主要负责和客户端沟通I/O

public class Server2 {

    // 创建方法,负责1和2和3

    public void service() {

       // 在服务器端,使用多线程开发,让每个客户端之间不用等待,可以并发访问,提高服务器的执行效率,提高吞吐量

       new Thread() {// 匿名对象+匿名内部类(重写run方法)

           // 把业务写入run()中

           @Override

           public void run() {

              try {

                  // 1,启动服务器,并在8000端口处等待客户端连接

                  ServerSocket server = new ServerSocket(8000);

                  System.out.println("服务器启动成功...");

 

                  while (true) {

                     // 2,一直接收所有客户端的连接请求

                     Socket socket = server.accept();

                     System.out.println("客户端连接成功...");

 

                     // 3,给每个客户端分配对应的话务员,1V1

                     HuaWuThread t = new HuaWuThread(socket);

                     t.start();

                  }

              } catch (IOException e) {

                  e.printStackTrace();

              }

           }

       }.start();// 启动线程

    }

 

    // 4,话务员:主要负责和客户端沟通I/O

    class HuaWuThread extends Thread {

       Socket socket;// 保持通话

       public HuaWuThread(Socket socket) {

           this.socket = socket;

       }

 

       // 把业务放入run(),一直读取客户端发来的数据,并作出回声数据

       @Override

       public void run() {

           try {

              //读取一行BufferedReader,并且写出一行PrintWriter

              BufferedReader in = new BufferedReader(

                                   new InputStreamReader(socket.getInputStream()));

             

              PrintWriter out = new PrintWriter(

                                    new OutputStreamWriter(socket.getOutputStream())) ;

              //读取客户端发来 的一行数据

              String line;//定义变量,记录读取到的一行的数据

              while( ( line = in.readLine() ) != null) {//只要有数据就一直读

                 

                  System.out.println("客户端发来的数据是:"+line);

                 

                  System.out.println("请输入您想要给客户端回声的数据:");

                  String input = new Scanner(System.in).nextLine();

                  out.println(input);//给客户端做的回声数据

                  out.flush();//把数据刷出去

              }

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

    }

 

    public static void main(String[] args) {

       Server2 s = new Server2();

       s.service();

    }

}


客户端:
//这个类用来做回声案例的客户端

//1,连接指定的服务器

//2,一直给服务器发送数据

//3,一直接收服务器回声的数据

public class Client2 {

    public static void main(String[] args) {

       try {

           // 1,连接指定的服务器,同时指定服务器的ip和端口号

           Socket socket = new Socket("127.0.0.1",8000);

           // 2,一直给服务器发送数据

           while(true) {

              //向服务器写出一行数据,并且读取服务器回声回来的一行数据

              PrintWriter out = new PrintWriter(

                                new OutputStreamWriter(socket.getOutputStream()));

              BufferedReader in = new BufferedReader(

                                new InputStreamReader(socket.getInputStream()));

             

              // 3,一直发送一直读取

              System.out.println("请输入您想要给服务器端发送的数据:");

              String input = new Scanner(System.in).nextLine();

              out.println(input);//向服务器发送了指定数据

              out.flush();//把数据刷出去

             

              String line = in.readLine();//读取回声数据

              System.out.println("服务器的回声数据是:"+line);

           }

       }catch (IOException e) {

           e.printStackTrace();

       }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值