基于socket的简单聊天程序(一)

最近工作比较闲,就学习了socket编程的基础知识,动手编写了一个功能最简单的局域网聊天程序:

一个客户端,一个服务端。 尚在完善中,欢迎大家指点赐教!

 

                                   常用函数功能简介

WSAStartup

在一个进程初始化 ws2.dll 动态库。

int WSAStartup(

  WORD wVersionRequested,// 所需版本号;

  LPWSADATA lpWSAData// 用于接受 socket 实现的细节;

);

示例代码:

if (WSAStartup(MAKEWORD(2,0),&WSAData))

{

    iError = WSAGetLastError();

}

 

WSACleanup

终结对动态库 ws2.dll 的使用。

 

Socket

创建一个与服务提供者相关联的socket

SOCKET socket(

  int af,// 协议族(如:AF_INET );

  int type,

  int protocol// 所使用的协议 (如:IPPROTO_TCPIPPROTO_UDP );

);

示例代码:

ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if ( ServerSocket ==  INVALID_SOCKET)

{

    iError = WSAGetLastError();

}

 

Bind

使用本地地址绑定某socket

int bind(

  SOCKET s,// 未绑定的socket 描述符;

  const struct sockaddr FAR* name,// 绑定地址;

  int namelen// 参数name 的长度;

);

示例代码:

char   IPAddress[32] = {"127.0.0.1"};

sa.sin_family = AF_INET;

sa.sin_port   = htons(3068);

sa.sin_addr.S_un.S_addr = inet_addr(IPAddress);//Server address can be INADDR_ANY;

rv = bind(ServerSocket, (SOCKADDR *) &sa, sizeof(SOCKADDR));

if (INVALID_SOCKET == rv)

{

iError = WSAGetLastError();

}

 

Listen

socket 置于监听状态,等待即将到来的连接请求。

int listen(

  SOCKET s,// 未连接, 但已经绑定地址的secket;

  int backlog// 等待队列的最大长度;

);

示例代码:

rv = listen(ServerSocket, 1);

if ( SOCKET_ERROR == rv )

{

    iError = WSAGetLastError();

}

 

Connect

使用创建的socket 连接指定的另一个socket 地址。

int connect(

  SOCKET s,//socket to be connected;

  const struct sockaddr FAR* name,//address to which socket connect;

  int namelen

);

示例代码:

char   IPAddress[32] = {"127.0.0.1"};

addrLen = sizeof(struct sockaddr_in);

sa.sin_family = AF_INET;

sa.sin_port   = htons(8080);//MYPORT,80,8080,25

sa.sin_addr.S_un.S_addr = inet_addr(IPAddress);

rv = connect(ClientSocket,(SOCKADDR *) &sa, sizeof(SOCKADDR));

if (NULL == rv)

{

    iError = WSAGetLastError();

}

 

Recv

从建立连接的socket 接受数据。

int recv(

  SOCKET s,// 已经建立连接的 socket;

  char FAR* buf,// 接受数据的 buffer;

  int len,//buffer 长度;

  int flags //

);

示例代码:

rv = recv(AcceptSocket,Buffer,BUFLEN,0);

if ( SOCKET_ERROR == rv )

{

    iError = WSAGetLastError();

}

else

    rcvlen = rv;

 

Accept

允许在指定 socket 上建立连接。

SOCKET accept(

  SOCKET s,// 已经处于监听状态的 socket;

  struct sockaddr FAR* addr,// 连接实体的地址描述;

  int FAR* addrlen

);

示例代码:

AcceptSocket = accept(ServerSocket, NULL, NULL);

if ( INVALID_SOCKET == AcceptSocket )

{

    iError = WSAGetLastError();

}

 

Send

通过已经建立连接 socket 发送数据。

int send(

  SOCKET s,

  const char FAR* buf,// 接受数据的 buffer;

  int len,//Buffer 长度;

  int flags

);

示例代码:

rv = send(ClientSocket,"Hello! Glad to see you!/r/n",strLen,0);

if ( SOCKET_ERROR == rv )

{

    iError = WSAGetLastError();

}

 

Shut down

关闭通过指定 socket 接受或发送数据。

int shutdown(

  SOCKET s,

  int how// 指定不再允许的操作;

);

示例代码:

Shutdown(s,SD_RECEIVE);//SD_SEND,SD_BOTH;.

 

Closesocket

关闭 socket 并释放相关资源。

int closesocket(

  SOCKET s// 需要关闭的 socket;

);

示例代码:

Closesocket(s);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这里给出一个简单的Python socket聊天程序的代码: 服务端: ```python import socket # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP和端口 server_socket.bind(('0.0.0.0', 9999)) # 开始监听 server_socket.listen(5) # 等待客户端连接 print('等待客户端连接...') client_socket, addr = server_socket.accept() print('客户端已连接,地址为:', addr) while True: # 接收客户端消息 recv_msg = client_socket.recv(1024).decode('utf-8') print('客户端:', recv_msg) # 发送消息给客户端 send_msg = input('我:') client_socket.send(send_msg.encode('utf-8')) ``` 客户端: ```python import socket # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端 client_socket.connect(('127.0.0.1', 9999)) while True: # 发送消息给服务端 send_msg = input('我:') client_socket.send(send_msg.encode('utf-8')) # 接收服务端消息 recv_msg = client_socket.recv(1024).decode('utf-8') print('服务端:', recv_msg) ``` 运行服务端和客户端代码,就可以进行聊天了。注意,这个是单向聊天,需要在服务端和客户端分别输入消息。如果要实现双向聊天,可以将服务端和客户端的代码合并,并且在发送消息后接收对方的回复。 ### 回答2: 以下是一个简单socket聊天程序的代码实现: ```python # 服务器端代码 import socket def server_program(): # 创建一个socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取主机名 host = socket.gethostname() port = 12345 # 设置监听的端口号 # 绑定主机名和端口号 server_socket.bind((host, port)) # 监听连接 server_socket.listen(1) print("等待客户端连接...") # 接受客户端连接 client_socket, address = server_socket.accept() print("连接来自: " + str(address)) while True: # 接收消息 data = client_socket.recv(1024).decode() print("收到消息: " + data) # 如果客户端发送的消息是"退出",则关闭连接 if data == "退出": break # 发送回复消息 message = input("回复消息: ") client_socket.send(message.encode()) # 关闭连接 client_socket.close() if __name__ == '__main__': server_program() ``` ```python # 客户端代码 import socket def client_program(): # 创建一个socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取服务器的主机名和端口号 host = socket.gethostname() port = 12345 # 连接服务器 client_socket.connect((host, port)) while True: # 发送消息 message = input("发送消息: ") client_socket.send(message.encode()) # 接收回复消息 data = client_socket.recv(1024).decode() print("收到回复: " + data) # 如果发送的消息是"退出",则断开连接 if message == '退出': break # 关闭连接 client_socket.close() if __name__ == '__main__': client_program() ``` 此聊天程序是基于TCP协议的socket通信实现的。首先,服务器端通过`socket.bind()`绑定主机名和监听的端口号,然后通过`socket.listen()`开始监听客户端的连接。当客户端连接成功后,服务器端通过`socket.accept()`接受客户端的连接请求,并打印连接来自哪个地址。 在循环中,服务器端接收客户端发送的消息,如果收到的消息是"退出",则断开连接;否则,服务器端通过`input()`获取回复消息,并通过`socket.send()`发送给客户端。 客户端通过`socket.connect()`连接服务器,同样也在循环中,首先通过`input()`发送消息给服务器端,然后通过`socket.recv()`接收服务器端的回复消息。如果发送的消息是"退出",则断开连接。 以上即为简易socket聊天程序的代码实现。 ### 回答3: 以下是一个简易的Socket聊天程序的代码示例: ```python # 服务器端代码 import socket # 创建一个TCP/IP socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器地址和端口 server_address = ('localhost', 12345) server_socket.bind(server_address) # 监听连接 server_socket.listen(1) print("等待客户端连接...") # 等待一个客户端连接 client_socket, client_address = server_socket.accept() print("已连接客户端:", client_address) while True: try: # 接收客户端发送的消息 data = client_socket.recv(1024).decode() if not data: break print("收到客户端消息:", data) # 回复消息给客户端 response = "服务器收到消息:" + data client_socket.sendall(response.encode()) except Exception as e: print("发生错误:", str(e)) break # 关闭连接 client_socket.close() server_socket.close() # 客户端代码 import socket # 创建一个TCP/IP socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器地址和端口 server_address = ('localhost', 12345) # 连接到服务器 client_socket.connect(server_address) print("已连接服务器:", server_address) while True: try: # 向服务器发送消息 message = input("请输入消息:") client_socket.sendall(message.encode()) # 接收服务器回复的消息 response = client_socket.recv(1024).decode() print("收到服务器消息:", response) except KeyboardInterrupt: print("聊天结束.") break # 关闭连接 client_socket.close() ``` 以上代码是一个简单的基于TCP/IP协议的Socket聊天程序程序运行时,服务器端先绑定地址和端口,并等待客户端连接。客户端连接到服务器后,可以输入消息发送给服务器,服务器收到消息后会发送回复给客户端。客户端接收到回复后再次发送消息,如此往复,直到通过键盘中断退出聊天

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值