javaTCP通信程序新手学习案例

TCP是一种面向广域网通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式: [1]

(1)基于流的方式;

(2)面向连接;

(3)可靠通信方式;

(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;

(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。

Tcp有 安全性高的协议,会确保双方完成连接,再通讯

     三次握手(确保连接),四次挥手(确保断开)的特点;

TCP主要使用Socket和IO流进行使用,是建立在客服端与服务端之间交流的法则,Socket和Io流是桥梁。

以下是使用Tcp学习的案例;

 建立一个服务端,使三个以上的客户端可以像群聊一样在本地互相通信;

思路是:通过Socket和Io流吧客户端发送的信息保存在服务端的集合中,再通过服务端返回到客户端中;

客户端代码:

package a724;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class b {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("localhost",7666);
        new  Thread(()->{
            Scanner scanner=new Scanner(System.in);while (true) {
                System.out.println("请输入");
                String s = scanner.nextLine();
                OutputStream outputStream = null;
                try {
                    outputStream = socket.getOutputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    outputStream.write(s.getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    outputStream.write("[over]".getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if ("exit".equals(s)) {break;
                }


            }
        }).start();
        new Thread(()->{
            try {
                InputStream inputStream=socket.getInputStream();
                Reader r=new InputStreamReader(inputStream);
                BufferedReader br=new BufferedReader(r);
                a: while (true){String s="";
                    while (true) {
                        int a = br.read();
                        s += (char) a;
                        if (s.endsWith("[over]"))
                        {
                            s = s.replace("[over]", "");
                            System.out.println("接收到" +args[0]+ s);
                            continue a;
                        }

                    }

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}服务端代码:
package a724;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Vector;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class a {
    public static void main(String[] args) throws IOException {
        ServerSocket socket=new ServerSocket(7666);
        ThreadPoolExecutor pool=new ThreadPoolExecutor(10,50,50,
                TimeUnit.SECONDS,new ArrayBlockingQueue<>(1));
        List<Socket>list=new Vector<>();
        for(int i=0;i<20;i++){pool.execute(()->{
            try {
                Socket socket1=socket.accept();list.add(socket1);
                InputStream inputStream=socket1.getInputStream();
                Reader r=new InputStreamReader(inputStream);
                BufferedReader br=new BufferedReader(r);
                a: while (true){String s="";
                    while (true){
                        int a= 0;
                        try {
                            a = br.read();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        s+=(char)a;
                        if(s.endsWith("[over]")) {
                            s = s.replace("[over]", "");
                            System.out.println("接收到" + s);
                            for (Socket l : list) {
                                 OutputStream outputStream=l.getOutputStream();
                                 outputStream.write(s.getBytes());
                                outputStream.write("[over]".getBytes());
                            }
                            continue a;

                        }

                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            

         });}}
      );}
    }

其中遇见的问题:1.使用Vector集合是线程安全的集合,内部原理是上锁;

2.需要添加标识符来告诉客户端向服务端输入完毕,否则会导致线程堵塞;

3.服务端和客户端端口要一致,否则无法尽享行通信

新手小白如有错误请谅解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值