使用TCP/UDP协议实现服务端与客户端之间的网络通信

1. 使用TCP协议实现服务端与客户端之间的网络通信

服务端TCPServer代码如下:

package cn.tu.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
//TCP服务端
public class TCPServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        BufferedReader reader = null;
        try {
            serverSocket = new ServerSocket(1001);
            System.out.println("TCP服务已启动......");
            //接收客户端的请求 (套接字是两台机器之间通讯的端点)
            socket = serverSocket.accept();
            //获得套接字的输入流
            //流 -> 服务器 (对于服务器来说是输入流)
            InputStream inputStream = socket.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream));
            while (true){
                //客户端要使用writer.newLine();来表示一条消息输入完成
                String line = reader.readLine();
                
                //从套接字中获得InetAddress
                InetAddress address = socket.getInetAddress();
                //客户端的IP
                String hostAddress = address.getHostAddress();
                //如果服务端从客户端接收到的是 exit 则会中断连接
                if("exit".equals(line)){
                    break;
                }
                System.out.println(hostAddress + "发送的数据是:" + line);
            }
            System.out.println("断开TCP服务!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(reader!=null){
                    reader.close();
                }
                if(socket!=null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}*

客户端TCPClient代码如下:

package cn.tu.tcp;

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

//TCP客户端
public class TCPClient {
    public static void main(String[] args) {

        Socket socket = null;

        BufferedWriter writer = null;
        BufferedReader reader = null;

        //UDP服务器的IP:192.168.0.103 此处服务器在本机
        try {
            socket = new Socket("192.168.0.103", 1001);

            //获得套接字的输出流
            //客户端 -> 流 (对于客户端来说是输出流)
            OutputStream outputStream = socket.getOutputStream();

            writer = new BufferedWriter(new OutputStreamWriter(outputStream));
            //控制台 -> 客户端
            reader = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("发送消息:");

            while (true) {

                String line = reader.readLine();
                writer.write(line);
                //产生新行
                //(因为服务端使用String line = reader.readLine();所以这一行不能少,否则服务端会认为客户端还没有输入完)
                writer.newLine();
                writer.flush();

                //输入exit表示退出客户端
                if ("exit".equals(line)) {
                    break;
                }
            }
            System.out.println("退出TCP客户端!");

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

                if (writer != null) {
                    writer.close();
                }

                if(reader!=null){
                    reader.close();
                }

                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

注意:记得先启动服务端,再运行客户端
TCP服务端运行效果图:
TCP服务端运行效果图
TCP客户端运行效果图:
TCP客户端运行效果图

2. 使用UDP协议实现服务端与客户端之间的网络通信

服务端UDPServer代码如下:

package cn.tu.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//UDP服务器端
public class UDPServer {
    public static void main(String[] args) {

        DatagramSocket socket = null;

        try {
            socket = new DatagramSocket(1000);

            byte[] bytes = new byte[1024];
            //数据报
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

            System.out.println("UDP服务器已启动......");

            while (true){
                //接收来自客户端的数据报
                socket.receive(packet);

                //从接收的数据报中获得InetAddress
                InetAddress address = packet.getAddress();
                //客户端的IP
                String hostAddress = address.getHostAddress();

                //从接收的数据报中获得数据
                byte[] data = packet.getData();
                //从接收的数据报中获得数据的长度
                int len = packet.getLength();

                String str = new String(data, 0, len);

                System.out.println(hostAddress + "发送的数据是:" + str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }

    }

}

客户端UDPClient代码如下:

package cn.tu.udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//UDP客户端
public class UDPClient {
    public static void main(String[] args) {

        DatagramSocket socket = null;
        BufferedReader reader = null;

        try {
            socket = new DatagramSocket();

            //String str = "世界你好";
            //byte[] bytes = str.getBytes();

            //控制台 -> 客户端
            reader = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("发送消息:");
            String line = null;
            while ((line = reader.readLine()) != null) {
                //输入exit表示退出客户端
                if("exit".equals(line)){
                    break;
                }

                byte[] bytes = line.getBytes();
                //创建数据报
                //UDP服务器的IP:192.168.0.103 此处服务器在本机
                DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                        InetAddress.getByName("192.168.0.103"), 1000);

                //向服务器发送数据报
                socket.send(packet);
            }

            System.out.println("退出UDP客户端!");


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (socket != null) {
                socket.close();
            }
        }

    }
}

注意:记得先启动服务端,再运行客户端
UDP服务端运行效果图:
UDP服务端运行效果图
UDP客户端运行效果图:
UDP客户端运行效果图

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用C语言编写socket客户端服务端的示例代码。 ## TCP通信示例 ### 服务端 以下是一个使用TCP协议实现服务端示例代码,它接收客户端发送的数据并将其打印出来: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8888 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置socket选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } // 设置socket地址结构 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定socket和地址结构 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听socket if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 等待客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 接收客户端发送的数据并打印出来 while(1) { valread = read(new_socket, buffer, 1024); printf("%s\n", buffer); send(new_socket, hello, strlen(hello), 0); } return 0; } ``` ### 客户端 以下是一个使用TCP协议实现客户端示例代码,它向服务端发送数据并接收服务端返回的数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 创建socket文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } // 设置socket地址结构 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将IP地址从点分十进制转换为网络字节序 if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接到服务端 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 发送数据到服务端 send(sock, hello, strlen(hello), 0); printf("Hello message sent\n"); // 接收服务端返回的数据并打印出来 valread = read(sock, buffer, 1024); printf("%s\n", buffer); return 0; } ``` ## UDP通信示例 ### 服务端 以下是一个使用UDP协议实现服务端示例代码,它接收客户端发送的数据并将其打印出来: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 int main(int argc, char const *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in servaddr, cliaddr; // 创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 设置socket地址结构 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); // 绑定socket和地址结构 bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // 接收客户端发送的数据并打印出来 while(1) { socklen_t len = sizeof(cliaddr); int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&cliaddr, &len); buffer[n] = '\0'; printf("%s\n", buffer); } return 0; } ``` ### 客户端 以下是一个使用UDP协议实现客户端示例代码,它向服务端发送数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 int main(int argc, char const *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in servaddr; // 创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 设置socket地址结构 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 发送数据到服务端 sendto(sockfd, "Hello, world", strlen("Hello, world"), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); return 0; } ``` 以上就是一个基本的Socket编程示例,如果您还有什么问题可以继续问我哦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值