黑马程序员——Socket网络编程聊天室
来源:互联网 发布:qq等级加速器软件 编辑:程序博客网 时间:2024/05/22 03:43
using System;
using System.Collections.Generic;using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace MyChatRoomServer
{
public partial class 服务端 : Form
{
public 服务端()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
}
Thread thread = null; //执行accept方法的线程
Thread RecThread = null;//执行receive方法的线程
Socket SocketWatch = null; //全局变量 监听客户端的套接字
Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
Dictionary<string, Thread> dicthread = new Dictionary<string, Thread>();
private void btnlisten_Click(object sender, EventArgs e)
{
SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
SocketWatch.Bind(endpoint);
SocketWatch.Listen(10);
ShowMessage("服务器启动成功!!!");
thread = new Thread(SocketListen);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 监听客户端的方法
/// </summary>
void SocketListen()
{
while (true)
{
//创建监听客户端的套接字
Socket SocketClient = SocketWatch.Accept();
dict.Add(SocketClient.RemoteEndPoint.ToString(), SocketClient);
//创建接收客户端发来的消息的线程
RecThread = new Thread(RecMsg);
RecThread.IsBackground = true;
RecThread.Start(SocketClient);
dicthread.Add(SocketClient.RemoteEndPoint.ToString(), RecThread);
//把客户端的ip信息加到列表中
lbonline.Items.Add(SocketClient.RemoteEndPoint.ToString());
ShowMessage("客户端监听成功" + SocketClient.RemoteEndPoint.ToString());
}
}
/// <summary>
/// 显示消息
/// </summary>
/// <param name="s"></param>
public void ShowMessage(string s)
{
txtMsg.AppendText(s+ "\n");
}
/// <summary>
/// 服务端向客户端发送消息的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
string StrSend = txtSendMsg.Text.ToString();
byte[] ByteSend = System.Text.Encoding.UTF8.GetBytes(StrSend);
string selectKey = lbonline.Text;
try
{
dict[selectKey].Send(ByteSend);
ShowMessage("服务端发送了消息" + StrSend);
}
catch (SocketException ex)
{
MessageBox.Show("还未选择要通信的客户端,请选择" + ex.ToString());
return;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
/// <summary>
/// 服务端接收客户端消息的方法
/// </summary>
public void RecMsg(object soc)
{
while (true)
{
byte[] arrMsgRec = new byte[1024 * 1024 * 2];
Socket SocketClient = soc as Socket;
try
{
int length = SocketClient.Receive(arrMsgRec);
if (arrMsgRec[0] == 0)
{
string str= System.Text.Encoding.UTF8.GetString(arrMsgRec,1,length-1);
ShowMessage(SocketClient.RemoteEndPoint.ToString() + "说:" + str);
}
else if(arrMsgRec[0]==1)
{
SaveFileDialog sfd = new SaveFileDialog();
if (sfd.ShowDialog()== DialogResult.OK)
{
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
{
fs.Write(arrMsgRec, 1, length - 1);
ShowMessage("文件保存成功");
}
}
}
}
catch(SocketException ex)
{
MessageBox.Show("客户端断开连接!!" + ex.ToString());
dict.Remove(SocketClient.RemoteEndPoint.ToString());
dicthread.Remove(SocketClient.RemoteEndPoint.ToString());
lbonline.Items.Remove(SocketClient.RemoteEndPoint.ToString());
break;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void btnSendAll_Click(object sender, EventArgs e)
{
foreach (string s in dict.Keys)
{
string StrSend = txtSendMsg.Text.ToString();
byte[] ByteSend = System.Text.Encoding.UTF8.GetBytes(StrSend);
dict[s].Send(ByteSend);
}
ShowMessage("服务端群发消息");
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace MyConnection
{
public partial class 客户端 : Form
{
public 客户端()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
}
Socket SocketWatch = null;
Thread thread = null;
private void btnConn_Click(object sender, EventArgs e)
{
SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtport.Text.Trim()));
try
{
SocketWatch.Connect(endpoint);
ShowMessage("连接服务器端成功,可以通信");
}
catch (SocketException ex)
{
MessageBox.Show("服务器还未启动,不能连接!!!" + ex.ToString());
return;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
thread = new Thread(RecMsg);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 接收消息的方法
/// </summary>
public void RecMsg()
{
byte[] arrMsgRec = new byte[1024 * 1024 * 2];
while (true)
{
int length =-1;
try
{
length = SocketWatch.Receive(arrMsgRec);
string str = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);
ShowMessage(str);
}
catch (SocketException ex)
{
MessageBox.Show(ex.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
public void ShowMessage(string s)
{
txtMsg.AppendText(s + "\n");
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
string strMsg = txtSendMsg.Text.ToString();
byte[] byteMsg =System.Text.Encoding.UTF8.GetBytes(strMsg);
byte[] byteMsgSend = new byte[byteMsg.Length+1];
byteMsgSend[0] = 0;
Buffer.BlockCopy(byteMsg, 0, byteMsgSend, 1, byteMsg.Length);
SocketWatch.Send(byteMsgSend);
ShowMessage("我说:" + strMsg);
}
/// <summary>
/// 打开文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
txtFilePath.Text = ofd.FileName;
}
}
/// <summary>
/// 发送文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendFile_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(txtFilePath.Text, FileMode.Open);
byte[] byteFile=new byte[1024*1024*2];
int length = fs.Read(byteFile, 0, byteFile.Length);
byte[] byteFIleSend = new byte[length + 1];
Buffer.BlockCopy(byteFile, 0, byteFIleSend, 1, length);
byteFIleSend[0] = 1;
SocketWatch.Send(byteFIleSend);
}
}
}
- 黑马程序员——Socket网络编程聊天室
- 黑马程序员 Socket网络编程--聊天室
- 黑马程序员——网络编程(Socket)
- 黑马程序员——网络编程(Socket编程)
- 黑马程序员——网络编程(Socket编程)下
- 黑马程序员----网络编程UDP多线程聊天室
- 黑马程序员————网络Socket编程
- 黑马程序员——Java---Socket网络编程原理
- 黑马程序员第六季——网络(Socket编程)
- 黑马程序员——网络概念及Socket编程示例
- 【黑马程序员】Socket 网络编程
- 黑马程序员--网络编程Socket
- 黑马程序员--网络编程Socket
- 黑马程序员-Socket网络编程
- 黑马程序员—多线程聊天室(Socket介绍+源码)
- 黑马程序员---网络编程(socket编程)
- 黑马程序员— 网络编程
- 黑马程序员—网络编程
- poj2362 dfs
- .Net应用程序发布的解决方案[最新整理](可加桌面快捷、在程序中加自己的ICO及自动卸载等)
- C# DataTable 中DataRow的RowState
- Android程序启动画面之Splash总结
- 角色扮演游戏中敌人AI(人工智能)的设计方法
- 黑马程序员——Socket网络编程聊天室
- Android成长之路-实现手机号归属地查找的应用
- Could not find generator devise:install.
- java一行一行写入或读取数据
- ubuntu开启SSH服务
- myeclispe8.5 -9.0 svn 安装
- 查询linux系统命令
- mysql数据库查询如何排序
- 使用LIBSVM需要注意的几个问题