SOCKET通信的客户端(向服务端发数据和接收服务段发送的数据)和服务端(接收客户端的数据和向客户端发数据)--(客户端可以一直发数据,服务端不停止)

客户端

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

/**
 * socket通信客户端
 */
public class Test01 {
    public static void main(String[] args) {
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        try{
            InetAddress addr = InetAddress.getByName("127.0.0.1");
            int port = 8086;
            Socket socket = new Socket(addr, port);
            //发送数据
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            String message = "要发送的数据===我是客户端";
            dataOutputStream.write(message.getBytes());

            //接收服务端的数据
            StringBuilder stringBuilder = new StringBuilder();
            dataInputStream = new DataInputStream(socket.getInputStream());
            byte[] buf = new byte[1024];
            int len = dataInputStream.read(buf);
            if (len != -1) {
                stringBuilder.append(new String(buf, 0, len));
            }
            dataInputStream.close();
            dataOutputStream.close();
            String receiveMessage = "" + stringBuilder;
            System.out.println("接收服务端发送的消息为:" + receiveMessage);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (dataOutputStream!=null){
                    dataOutputStream.close();
                }
                if (dataInputStream!=null){
                    dataInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

服务端

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

/**
 * socket通信服务端
 */
public class Test02 {
    public static void main(String[] args)  {

        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        try {
            // 建立服务监听
            ServerSocket serverSocket = new ServerSocket(8086);
            System.out.println("建立Socket链接!!!");
            while (true) {
                Socket socket = serverSocket.accept();
                //接收客户端的消息
                StringBuilder stringBuilder = new StringBuilder();
                dataInputStream = new DataInputStream(socket.getInputStream());
                byte[] buf = new byte[1024];
                int len = dataInputStream.read(buf);
                if (len != -1) {
                    stringBuilder.append(new String(buf, 0, len));
                }
                String receiveMessage = "" + stringBuilder;
                System.out.println("接收客户端发送的消息为:" + receiveMessage);

                //向客户端发送数据
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                String message = "要发送的数据==我是服务端";
                dataOutputStream.write(message.getBytes());
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (dataOutputStream!=null){
                    dataOutputStream.close();
                }
                if (dataInputStream!=null){
                    dataInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答。首先,您需要了解以下几个概念: 1. Socket:套接字,是网络通信的基本操作单元,负责在应用程序之间传递数据。 2. IP地址和端口号:在网络通信中,每个网络设备都有一个唯一的IP地址,而端口号则用于标识应用程序。 3. TCP和UDP协议:TCP协议提供可靠的、面向连接的通信服务,而UDP协议则提供不可靠的、无连接的通信服务。 接下来,我们来编写一个简单的客户端服务端程序,实现数据发送接收服务端程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define PORT 8888 int main() { WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; int clientAddrLen = sizeof(clientAddr); char recvBuf[1024] = {0}; char sendBuf[1024] = {0}; int ret; // 初始化Winsock库 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed\n"); return -1; } // 创建Socket serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { printf("create socket failed\n"); WSACleanup(); return -1; } // 绑定IP地址和端口号 serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("bind failed\n"); closesocket(serverSocket); WSACleanup(); return -1; } // 监听端口 if (listen(serverSocket, 5) == SOCKET_ERROR) { printf("listen failed\n"); closesocket(serverSocket); WSACleanup(); return -1; } printf("server is listening on port %d\n", PORT); // 接收客户端连接 clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen); if (clientSocket == INVALID_SOCKET) { printf("accept failed\n"); closesocket(serverSocket); WSACleanup(); return -1; } // 接收客户端发送数据 ret = recv(clientSocket, recvBuf, sizeof(recvBuf), 0); if (ret > 0) { printf("recv from client: %s\n", recvBuf); } // 发送数据客户端 strcpy(sendBuf, "hello, client"); ret = send(clientSocket, sendBuf, strlen(sendBuf), 0); if (ret == SOCKET_ERROR) { printf("send failed\n"); closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); return -1; } // 关闭Socket closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); return 0; } ``` 客户端程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define SERVER_IP "127.0.0.1" #define PORT 8888 int main() { WSADATA wsaData; SOCKET clientSocket; struct sockaddr_in serverAddr; char recvBuf[1024] = {0}; char sendBuf[1024] = {0}; int ret; // 初始化Winsock库 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed\n"); return -1; } // 创建Socket clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("create socket failed\n"); WSACleanup(); return -1; } // 连接服务器 serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP); if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("connect failed\n"); closesocket(clientSocket); WSACleanup(); return -1; } // 发送数据服务器 strcpy(sendBuf, "hello, server"); ret = send(clientSocket, sendBuf, strlen(sendBuf), 0); if (ret == SOCKET_ERROR) { printf("send failed\n"); closesocket(clientSocket); WSACleanup(); return -1; } // 接收服务发送数据 ret = recv(clientSocket, recvBuf, sizeof(recvBuf), 0); if (ret > 0) { printf("recv from server: %s\n", recvBuf); } // 关闭Socket closesocket(clientSocket); WSACleanup(); return 0; } ``` 服务端程序会监听8888端口,当有客户端连接时,会接收客户端发送数据,并发送数据客户端客户端程序会连接127.0.0.1的8888端口,发送数据服务端,并接收服务端发送数据。 注意:在Visual Studio中编译时,需要将项目属性中的“配置属性”->“C/C++”->“代码生成”->“运行库”设置为“多线程调试(/MTd)”或“多线程(/MT)”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值