使用TCP实现简单的聊天功能

简介

当我们在网上进行数据传输的时候,首先需要建立稳定的连接(针对于TCP),然后通过Socket(套接字)将数据以流的方式输入输出,让双方的数据进行交互。而对于UDP,只需要知道对方的地址即可,不需要进行稳定的连接。TCP比较稳定,效率低。UDP效率比较高,但不稳定。

用TCP实现简单聊天功能

创建一个客户端和一个服务器端,模拟通讯
创建一个服务器端
package Socket;

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

/**
 * 服务器
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(7832);//Socket的服务器 并且指定端口号

        System.out.println("服务器开启监听!");    
        //服务器开始监听
        Socket socket=server.accept();//服务器开始监听    阻塞

        InputStream ins=socket.getInputStream();//返回此套接字的输入流。
        OutputStream ous=socket.getOutputStream();//返回此套接字的输出流。

        BufferedReader br=new BufferedReader(new InputStreamReader(ins));//将客户端那边的信息 放入缓存流
        PrintWriter pw=new PrintWriter(ous,true);//通过Socket自带的流将数据  输出到客户端

        Scanner input=new Scanner(System.in);
        String str=null;
        while (true){    //让客户端和服务器一直发送消息
            System.out.println(br.readLine());//输出客户端的信息
            str=input.nextLine();
            pw.println("女朋友:"+str);  //将信息输出到客户端
        }
    }
}

首先要创建一个服务器,并且指定端口号。端口号也就是每一个进程所特有的一个ID号(自己的理解),端口号的范围在0-65535之间,0-1023系统所保留,HTTP的端口号80。。。然后让服务器开启监听,如果有客户端连接,就通过Socket自带的输入输出流进行信息的交互。

创建一个客户端
package Socket;

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

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) throws IOException {
                            // 指定服务器的IP地址     端口号
        Socket socket=new Socket("localhost",7832);

        InputStream is=socket.getInputStream();//得到Socket自带的输入流
        OutputStream os=socket.getOutputStream();//得到Socket自带的输出流

        BufferedReader br=new BufferedReader(new InputStreamReader(is));//将输入流 放入 缓存中
        PrintWriter pw=new PrintWriter(os,true);//通过输出流   向服务器发消息

        Scanner input=new Scanner(System.in);
        String str=null;

        while (true){
            str=input.nextLine();
            pw.println("我:"+str);//发消息
            System.out.println(br.readLine());//收消息
        }
    }
}

创建一个客户端并且指定所连接的服务器的IP地址和端口号。因为我在自己电脑同时开启服务器和客户端,所以用localhost(本地IP地址)。如果你需要在两台电脑上测试的话,只需要改成对方服务器的IP地址即可。

开启服务器和客户端

一定要先开启服务器让服务器开启监听,再开启客户端,不然会报错。

运行截图:


总结

在使用Socket通讯时,当我们建立连接后,然后根据Socket自带的流getInputStream,getOutputStream进行数据的信息的输入输出。通过getInputStream将对方的信息输出到控制台,用getOutputStream将自己的信息输出给对方,从而达到了彼此通讯的效果。


        每日鸡汤:有梦想的人睡不着,没梦想的人睡不醒。 这个世界根本不存在“不会”这回事,当你失去所有依靠的时候,你自然就什么都会了。


Over!

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单聊天室私聊功能的示例代码,使用 TCP Socket 实现,包括服务器和客户端代码。请注意,这只是一个示例,实际应用中可能需要更多的错误处理和安全性检查。 服务器代码: ```python import socket # 创建 TCP Socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_address = ('localhost', 8888) server_socket.bind(server_address) # 监听连接 server_socket.listen(5) # 存储已连接的客户端 Socket 和昵称 clients = {} nicknames = {} print('Server started, waiting for connections...') while True: # 接受连接 client_socket, client_address = server_socket.accept() # 接收客户端昵称 nickname = client_socket.recv(1024).decode() # 存储客户端 Socket 和昵称 clients[client_socket] = client_address nicknames[client_socket] = nickname print(f'New connection from {client_address[0]}:{client_address[1]}, nickname: {nickname}') # 广播新用户加入消息 for sock in clients: message = f'{nickname} has joined the chat!' sock.send(message.encode()) while True: # 接收消息 data = client_socket.recv(1024).decode() if not data: break # 解析消息 parts = data.split(' ', 1) if len(parts) != 2: message = 'Invalid command, usage: /msg <nickname> <message>' client_socket.send(message.encode()) continue recipient_nickname, message = parts # 查找收件人 Socket recipient_socket = None for sock, nickname in nicknames.items(): if nickname == recipient_nickname: recipient_socket = sock break if not recipient_socket: message = f'User {recipient_nickname} not found' client_socket.send(message.encode()) continue # 发送私聊消息 message = f'{nickname} (private): {message}' recipient_socket.send(message.encode()) # 关闭客户端连接 message = f'{nickname} has left the chat.' print(message) del clients[client_socket] del nicknames[client_socket] client_socket.close() # 广播用户离开消息 for sock in clients: sock.send(message.encode()) ``` 客户端代码: ```python import socket import threading # 创建 TCP Socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_address = ('localhost', 8888) client_socket.connect(server_address) # 输入昵称 nickname = input('Enter your nickname: ') client_socket.send(nickname.encode()) # 接收消息并输出 def receive(): while True: message = client_socket.recv(1024).decode() print(message) # 输入并发送消息 def send(): while True: message = input() # 判断是否为私聊命令 if message.startswith('/msg'): parts = message.split(' ', 2) if len(parts) != 3: print('Invalid command, usage: /msg <nickname> <message>') continue recipient_nickname, message = parts[1:] message = f'/msg {recipient_nickname} {message}' client_socket.send(message.encode()) # 启动接收和发送线程 receive_thread = threading.Thread(target=receive) receive_thread.start() send_thread = threading.Thread(target=send) send_thread.start() ``` 在客户端输入 `/msg <nickname> <message>` 命令可以向指定昵称的用户发送私聊消息。例如,输入 `/msg Alice Hello Alice!` 可以向昵称为 `Alice` 的用户发送私聊消息。 需要注意的是,该示例代码没有加入任何的安全性检查和错误处理,实际应用中需要加入相关处理以提高系统的可靠性和安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值