TCP、UDP及Socket代码示例

上一篇 << 下一篇 >>>Https的1.0、2.0协议及长短链接区别


TCP的服务端在收不到消息的时候,会一直处于等待状态,核心代码:Socket accept = serverSocket.accept();
UDP的发送和接收不经过三次握手,允许存在失败丢失的情况。

1.TCP代码

1.1 服务器端

public class SocketTcpServer {
    public static void main(String[] args) throws IOException {
        // 创建Server Socket
        ServerSocket serverSocket = new ServerSocket();
        // 创建我们的 Socket 监听连接地址和端口号
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        // 绑定我们的监听地址
        serverSocket.bind(address);
        // 等待接受请求
        System.out.println("等待客户端发送消息..");
// 此代码监听是否完成三次握手,如果执行完则继续,否则一直阻塞等待
        Socket accept = serverSocket.accept();
        // 获取OutputStream流
        PrintWriter socketOut = new PrintWriter(accept.getOutputStream());
        byte buf[] = new byte[1024];
        if (accept.getInputStream().read(buf) > 0) {
            System.out.println("服务器端接受到客户端消息:" + new String(buf));
        }
        // 服务器端响应消息
        String sendStr = "我是jarye";
        socketOut.write(sendStr);
        socketOut.flush();

        // 关闭所有连接
        socketOut.close();
        accept.close();
        serverSocket.close();
    }
}

1.2 客户端

public class SocketTcpClient {
    public static void main(String[] args) throws IOException {
        // 创建socket
        final Socket socket = new Socket();
        // 创建socket地址
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        socket.connect(address);
        // 创建PrintWriter
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        BufferedReader socketIn = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));

        // 向服务器发送的内容
        String sendStr = "客户端问服务器端:你是jarye吗?";
        socketOut.write(sendStr);
        socketOut.flush();
        String receiveStr = socketIn.readLine();
        System.out.println("服务器端回复:: " + receiveStr);

        // 关闭连接
        socketOut.close();
        socketIn.close();
        socket.close();
    }
}

2.UDP代码

2.1 服务端代码

/*
 * 接收客户端发送的数据
 */
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];
//创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
//此方法在接收到数据报之前会一直阻塞
socket.receive(packet);
//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);

/*
 * 向客户端响应数据
 */
//1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "大家好啦~~".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();

2.2 客户端代码

/*
 * 向服务器端发送数据
 */
//1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "大家好吗?".getBytes();
//2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//4.向服务器端发送数据报
socket.send(packet);

/*
 * 接收服务器端响应的数据
 */
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
//4.关闭资源
socket.close();

3.使用Socket模拟Http服务器

public class HttpTest {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        //一直监听,直到受到停止的命令
        while (true) {
            Socket socket = null;
            try {
                //如果没有请求,会一直hold在这里等待,有客户端请求的时候才会继续往下执行
                socket = serverSocket.accept();
                //获取输入流(请求)
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                StringBuilder stringBuilder = new StringBuilder();
                String line = null;
                //得到请求的内容,注意这里作两个判断非空和""都要,只判断null会有问题
                while ((line = bufferedReader.readLine()) != null
                        && !line.equals("")) {
                    stringBuilder.append(line).append("
"); } String result = stringBuilder.toString(); System.out.println(result); //这里第二个参数表示自动刷新缓存 PrintWriter printWriter = new PrintWriter( socket.getOutputStream(), true); printWriter.println("HTTP/1.1 200 OK"); printWriter.println("Content-Type:text/html;charset=utf-8"); printWriter.println(); printWriter.println("
你刚才发送的请求数据是:
"); //将日志输出到浏览器 printWriter.write(result); printWriter.println("
"); // release printWriter.close(); bufferedReader.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

推荐阅读:
<< << << << << << << << << << << <<<粘包和拆包问题解决方案汇总
<<<序列化与反序列化知识点汇总
<< <<

你可能感兴趣的:(TCP、UDP及Socket代码示例)