Socket实现简单的聊天通信
最近学习了Socket后,感觉Socket挺好玩的,在博客中看到socket在实时聊天功能的很强大,于是乎就做了一个简单的聊天功能,今天贴出来,能够与大家一起共享,有不对之处,能够给予指出,谢谢!
服务器中的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net; namespace Chat_SocketServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
} //服务端 监听套接字
Socket socketWatch = null;
//服务端 监听线程
Thread threadWatch = null;
//字典集合:保存通信套接字
Dictionary<string,Socket> dictCon = new Dictionary<string,Socket>(); private void Watch_Click(object sender, EventArgs e)
{
try {
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.绑定端口
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(ip_txt.Text);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(port_txt.Text)); //2.2绑定端口(其实内部 就向系统的 端口表中 注册 了一个端口,并指定了当前程序句柄)
socketWatch.Bind(endPoint);
//2.3设置监听队列
socketWatch.Listen();
//2.4开始监听,调用监听线程 执行 监听套接字的 监听方法
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
ShowMsg("服务器成功启动啦!");
} catch (Exception ex) {
MessageBox.Show(ex.Message);
throw;
}
} private void Send_Click(object sender, EventArgs e)
{ string strClient = this.lbOnline.Text;
if (string.IsNullOrEmpty(strClient))
{
MessageBox.Show("请选择你要发送消息的客户端!");
return;
}
if (dictCon.ContainsKey(strClient))
{
string strMsg = this.send_txt.Text.Trim();
ShowMsg("\r\n向客户端【" + strClient + "】说:" + strMsg);
//使用 指定的 通信套接字 将 字符串 发送到 指定的客户端
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
dictCon[strClient].Send(arrMsg);
}
this.send_txt.Text = "";
} void WatchConnecting() {
//2.4开始监听:此方法会阻断当前线程,直到有 其它程序 连接过来,才执行完毕
Socket sokMsg = socketWatch.Accept();
//将当前连接成功的 【与客户端通信的套接字】 的 标识 保存起来,并显示到 列表中
//将 远程客户端的 ip和端口 字符串 存入 列表
this.lbOnline.Items.Add(sokMsg.RemoteEndPoint.ToString());
//将 服务端的通信套接字 存入 字典集合
dictCon.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg);
ShowMsg("\r\n客户端【" + sokMsg.RemoteEndPoint.ToString() + "】上线了!");
//2.5创建 通信线程
Thread thrMsg = new Thread(ReceiveMsg);
thrMsg.IsBackground = true;
thrMsg.Start(sokMsg);
}
void ReceiveMsg(object obj) {
try {
Socket sokMsg = obj as Socket;
//3.通信套接字 监听 客户端的 消息
//3.1创建 消息缓存区
byte[] arrMsg = new byte[ * * ];
while (true) {
//3.2接收客户端的消息 并存入 缓存区,注意:Receive方法也会阻断当前的线程
sokMsg.Receive(arrMsg);
//3.3将接收到的消息 转成 字符串
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
//3.4将消息 显示到 文本框
ShowMsg("\r\n" + strMsg);
}
} catch (Exception ex) {
MessageBox.Show(ex.Message); throw;
}
}
void ShowMsg(string strmsg) {
this.show_txt.AppendText(strmsg + "\r\n");
}
}
}
客户端的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net; namespace Chat_SocketClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
}
//客户端 通信套接字
Socket socketMsg = null;
//客户端 通信线程
Thread threadMsg = null;
//标记任务
bool isRec = true; private void Conn_Click(object sender, EventArgs e)
{
try {
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
socketMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.获取要连接的服务端 节点
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(ip_textbox.Text);
IPEndPoint endPoint = new IPEndPoint(address,
int.Parse(port_textbox.Text));
//3.向服务端 发送链接请求
socketMsg.Connect(endPoint);
ShowMsg("连接服务器成功~~!");
//4.开启通信线程
threadMsg = new Thread(RecevieMsg);
threadMsg.IsBackground = true;
threadMsg.Start();
} catch (Exception ex) {
MessageBox.Show(ex.Message);
throw;
}
} private void Send_Click(object sender, EventArgs e)
{
string strMsg = this.info_textbox.Text.Trim();
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
ShowMsg("\r\n我说:" + strMsg);
socketMsg.Send(arrMsg);
this.info_textbox.Text = "";
} void RecevieMsg() {
try {
//3.1创建 消息缓存区
byte[] arrMsg = new byte[ * * ];
while (isRec) {
socketMsg.Receive(arrMsg);
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
ShowMsg("\r\n服务器说:" + strMsg);
}
} catch (Exception ex) {
MessageBox.Show(ex.Message);
throw;
}
}
void ShowMsg(string strmsg) {
this.richTextBox1.AppendText(strmsg + "\r\n");
} }
}
相关资料推荐:http://www.newxing.com/Tech/DotNet/CSharp/Socket_133.html写的聊天通信也很不错哟!
Socket实现简单的聊天通信的更多相关文章
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
- WinForm的Socket实现简单的聊天室 IM
1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...
- java Socket实现简单在线聊天(一)
最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...
- Python Socket实现简单的聊天室
通过参考其他牛人的文章和代码, 再根据自己的理解总结得出, 说明已经加在注释中, FYI 主要参考文章: http://blog.csdn.net/dk_zhe/article/details/3 ...
- java Socket实现简单在线聊天(三)
在上一篇,利用线程使服务端实现了能够接收多客户端请求的功能,这里便需要客户端接收多客户端消息的同时还能把消息转发到每个连接的客户端,并且客户端要能在内容显示区域显示出来,从而实现简单的在线群聊. 在实 ...
- 基于socket的简单p2p聊天项目
https://blog.csdn.net/Jacky_Can/article/details/74984822 https://blog.csdn.net/qq_20889581/article/d ...
- Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程.在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被 ...
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
- socket实例C语言:一个简单的聊天程序
我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是SOCKET编程.不废话多说了,先附上代码: 服务器端server.c #include <stdio.h> #incl ...
随机推荐
- linux 打补丁
http://blog.csdn.net/maotianwang/article/details/11107083
- careercup-树与图 4.1
4.1 实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1. C++实现代码: #include<iostream> #includ ...
- bind的例子
10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值. #include<iostream> #include ...
- android中实现简单的播放
MediaPlayer mediaPlayer1; mediaPlayer1 = MediaPlayer.create(getBaseContext(), R.raw.ic_yanyuan); med ...
- Hibernate事务管理
User类: public class User implements Serializable{ public User(){} private Integer id; private String ...
- 移动端Web页面问题
1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...
- 重温css系列01
2016-01-07——解决背景层透明度的问题 需要ie9+ 问题:如果我对div设置opacity: 0.8;这个透明属性后 希望内容不发生改变怎么弄? A:做两层,或者rgba 解决后的效果图: ...
- Sql遍历更新脚本
DECLARE My_Cursor CURSOR --定义游标 declare@indexId int FOR (SELECT * FROM dbo.GalleryPhoto) --查出需要的集合放到 ...
- uploadify上传控件使用
uploadify是JQuery的一个上传插件,实现的效果非常不错,并且带进度显示,我将给大家演示如何使用uploadify进行图片上传, 1.点我下载http://www.uploadify.com ...
- 二维码QRCode
package com.aig.ecompass.ecard; import java.awt.image.BufferedImage; import java.io.File; import jav ...