基于TCP的socket简易聊天程序(服务端和客户端)

基于TCP的socket程序服务端和客户端,基本要求:客户端能发送消息到服务端,服务端再把此消息返回给客户端。

1.1服务端:

        (1). 初始化WSA,构建一个Socket,指定本地的端口,用于监听其连接请求。

     (2).调用socket的accept()方法获得客户端的连接请求,建立与客户端的连接。

     (3).进行数据的写入和读出。

(4).调用closesocket()方法关闭socket连接 。



#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>  //WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以 
					   //可以用WINSOCK2.H); 

#pragma comment(lib, "WS2_32.lib")//Ws2_32.lib(WINSOCK API连接库文件).

#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
	WSADATA wsaData;
    SOCKET  socketL;  // socket for listening
    SOCKET  socketC;  // socket for Communication
    SOCKADDR_IN
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
里面包含聊天室的客户端服务器端的源文件和一份完整的设计报告。 一、 系统概要 本系统能实现基于VC++的网络聊天室系统。有单独的客户端服务器端。 服务器应用程序能够接受来自客户端的广播,然后向客户端发送本机的IP与服务端口,让客户端接入到服务器进行聊天,检测用户名是否合法(重复),服务器责接收来自客户端聊天信息,并根据用户的需求发送给指定的人或所有人,能够给出上线下线提示。客户端能够发出连接请求,能编辑发送信息,可以指定发给单人或所有人,能显示聊天人数,上线下线用户等。 二、 通信规范的制定 服务请求规范: 服务器端: (1) 创建一个UDP的套接字,接受来自客户端的广播请求,当请求报文内容为“REQUEST FOR IP ADDRESS AND SERVERPORT”时,接受请求,给客户端发送本服务器TCP聊天室的端口号。 (2) 创建一个主要的TCP协议的套接字负责客户端TCP连接 ,处理它的连接请求事件。 (3)在主要的TCP连接协议的套接字里面再创建TCP套接字保存到动态数组里,在主要的套接字接受请求后 ,就用这些套接字和客户端发送和接受数据。 客户端: (1) 当用户按“连接”按钮时,创建UDP协议套接字,给本地计算机发广播,广播内容为“REQUEST FOR IP ADDRESS AND SERVERPORT”。 (2)当收到服务器端的回应,收到服务器发来的端口号后,关闭UDP连接。根据服务器的IP地址和端口号重新创建TCP连接。 故我思考:客户端一定要知道服务器的一个端口,我假设它知道服务器UDP服务的端口,通过发广播给服务器的UDP服务套接字,然后等待该套接字发回服务器TCP聊天服务的端口号,IP地址用ReceiveForom也苛刻得到。 通信规范 通信规范的制定主要跟老师给出的差不多,并做了一小点增加: (增加验证用户名是否与聊天室已有用户重复,在服务器给客户端的消息中,增加标志0) ① TCP/IP数据通信 --- “聊天”消息传输格式 客户机 - 服务器 (1)传输“用户名” STX+1+用户名+ETX (2) 悄悄话 STX+2+用户名+”,”+内容+ETX (3) 对所有人说 STX+3+内容+ETX 服务器- 客户机 (0)请求用户名与在线用户名重复 //改进 STX+0+用户名+EXT (1)首次传输在线用户名 STX+1+用户名+ETX (2)传输新到用户名 STX+2+用户名+ETX (3)传输离线用户名 STX+3+用户名+ETX (4)传输聊天数据 STX+4+内容+ETX (注:STX为CHR(2),ETX 为CHR(3)) 三、 主要模块的设计分析 四、 系统运行效果 (要求有屏幕截图) 五、 心得与体会
好的,基于TCP协议的简易聊天机器人代码可以分为服务端客户端两部分。以下是一个示例代码,可以实现两个客户端服务端简单聊天服务端代码: ```python import socket # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 9999)) # 监听端口,等待客户端连接 server_socket.listen(2) print('Waiting for clients...') # 接收客户端连接请求 client1_socket, addr1 = server_socket.accept() print('Client1 connected:', addr1) client2_socket, addr2 = server_socket.accept() print('Client2 connected:', addr2) # 服务端循环接收客户端发送的消息,并将消息转发给另一个客户端 while True: try: # 接收客户端发送的消息 client1_msg = client1_socket.recv(1024).decode() if not client1_msg: break print('Client1:', client1_msg) # 将消息转发给另一个客户端 client2_socket.send(client1_msg.encode()) client2_msg = client2_socket.recv(1024).decode() if not client2_msg: break print('Client2:', client2_msg) client1_socket.send(client2_msg.encode()) except ConnectionResetError: print('Client disconnected') break # 关闭连接 client1_socket.close() client2_socket.close() server_socket.close() ``` 客户端代码: ```python import socket import threading def recv_msg(client_socket): # 循环接收服务器发送的消息并打印 while True: try: msg = client_socket.recv(1024).decode() if not msg: break print(msg) except ConnectionResetError: print('Server disconnected') break # 关闭连接 client_socket.close() # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect(('127.0.0.1', 9999)) # 创建一个线程用于接收服务器发送的消息 t = threading.Thread(target=recv_msg, args=(client_socket,)) t.start() # 循环从命令行输入消息并发送给服务器 while True: try: msg = input() client_socket.send(msg.encode()) except ConnectionResetError: print('Server disconnected') break # 关闭连接 client_socket.close() ``` 注意事项: - 以上代码仅供参考,具体实现需要根据实际情况进行调整。 - 如果需要增加更多的客户端,可以在服务端代码中增加相应的连接和消息转发逻辑。 - 在客户端代码中,需要创建一个线程用于接收服务器发送的消息,否则程序会阻塞在recv方法上,无法输入消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值