Go语言TCP通信实现同时多句聊天

效果展示

在这里插入图片描述在这里插入图片描述

服务端

package main

import (
	"fmt"
	"net"
	"sync"
)

func main() {
	//step1:确认服务器地址和端口,ip:port
	port := ":9527"
	tcpaddr, err := net.ResolveTCPAddr("tcp4", port)
	if err != nil {
		fmt.Println(err)
	}
	//step2:获取监听端口
	tcpListener, err := net.ListenTCP("tcp4", tcpaddr)
	if err != nil {
		fmt.Println(err)
	}
	//step3:监听该端口
	fmt.Println("服务端聊天界面。。。。。。。。。。。。。。")
	tcpConn, err := tcpListener.AcceptTCP()
	if err != nil {
		fmt.Println(err)
	}
	//step4:数据交互
	//rTcpConn := make([]byte, 520)
	//lenConn, err := tcpConn.Read(rTcpConn)
	//if err != nil {
	//	fmt.Println(err)
	//}
	//fmt.Println("服务端说:", string(rTcpConn[:lenConn]))

	var wg sync.WaitGroup
	wg.Add(2)
	//开启2个go协程,并阻塞其运行,完成多句在线聊天
	go func() {
		//fmt.Println("go11111") //go1、2都处于阻塞状态
		defer wg.Done()
		for {
			//循环写
			wTcpConn := ""
			fmt.Scanln(&wTcpConn) //阻塞
			if wTcpConn == "over" {
				tcpConn.Write([]byte(wTcpConn))
				break
			}
			tcpConn.Write([]byte(wTcpConn))
		}
	}()
	go func() {
		//fmt.Println("go2222")
		defer wg.Done()
		for {
			//循环读
			rTcpConn := make([]byte, 520)
			lenTcpConn, err := tcpConn.Read(rTcpConn)  //阻塞
			if err != nil || string(rTcpConn[:lenTcpConn]) == "over" {
				//fmt.Println("错误1:", err)
				fmt.Println("客户端说:", string(rTcpConn[:lenTcpConn]))
				break
			}
			fmt.Println("客户端说:", string(rTcpConn[:lenTcpConn]))
		}
	}()

	wg.Wait()
	defer tcpConn.Close()
}

客户端

package main

import (
	"fmt"
	"net"
	"sync"
)

func main() {
	//step1:获取服务器ip+port
	tcpAddr, err := net.ResolveTCPAddr("tcp4", "192.168.31.205:9527")
	if err != nil {
		fmt.Println(err)
	}
	//step2:发送连接请求
	tcpConn, err := net.DialTCP("tcp4", nil, tcpAddr)
	if err != nil {
		fmt.Println(err)
	}
	//step3:数据交互
	//tcpConn.Write([]byte("hello,我是客户端"))

	fmt.Println("客户端聊天界面。。。。。。。。。。。。。。")
	var wg sync.WaitGroup
	wg.Add(2)
	//开启2个go协程,并阻塞其运行,完成多句在线聊天
	go func() {
		//fmt.Println("go11111")
		defer wg.Done()
		for {
			//循环写
			wTcpConn := ""
			fmt.Scanln(&wTcpConn) //阻塞
			if wTcpConn == "over" {
				tcpConn.Write([]byte(wTcpConn))
				break
			}
			tcpConn.Write([]byte(wTcpConn))
		}
	}()
	go func() {
		//fmt.Println("go22222")
		defer wg.Done()
		for {
			//循环读
			rTcpConn := make([]byte, 520)
			lenTcpConn, err := tcpConn.Read(rTcpConn) //阻塞
			if err != nil || string(rTcpConn[:lenTcpConn]) == "over" {
				//fmt.Println("错误1:", err)
				fmt.Println("服务端说:", string(rTcpConn[:lenTcpConn]))
				break
			}
			fmt.Println("服务端说:", string(rTcpConn[:lenTcpConn]))
		}
	}()

	//stop4:结束
	wg.Wait()
	defer tcpConn.Close()

}

GitHub源码地址



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现TCP客户端之间多线程通信需要以下步骤: 1. 创建Socket连接:使用Socket类创建客户端Socket对象,并指定服务器IP地址和端口号。 2. 创建输入输出流:创建客户端的输入输出流,以便进行数据的读写。 3. 实现多线程通信:使用多线程技术实现客户端之间的通信,每个客户端启动一个线程来处理与其他客户端的通信。 4. 消息传输:对于每个客户端,通过输出流把消息送到服务器服务器再把消息送给其他客户端。 5. 关闭连接:当客户端不再需要连接时,需要关闭Socket连接,释放资源。 实现聊天页面的UI需要以下步骤: 1. 设计UI界面:设计一个聊天窗口,包含输入框、送按钮以及显示框。 2. 实现UI控件:使用Swing或JavaFX等工具实现UI控件,添加事件监听器。 3. 实现消息:当用户在输入框中输入消息并点击送按钮时,将消息送到服务器。 4. 实现接收消息:当用户接收到其他客户端送的消息时,在显示框中显示消息。 5. 处理异常:在连接服务器时,可能会出现各种异常,需要在程序中进行处理。 注意事项: 1. 多线程通信需要注意线程安全问题,避免数据竞争和死锁。 2. UI设计需要考虑用户体验和美观度,应该尽可能地简洁明了。 3. 对于网络连接异常,应该给出友好的提示信息,避免用户因网络问题而感到困扰。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值