我在写服务器端的时候出现了这些问题,大家帮帮忙看看是什么问题,急!!!
代码如下: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 服务器_Server
{
/// <summary>
/// 服务器:
/// delegate:委托的关键字
/// ThreadStart:当运行此方法时,该方法中的参数只要输入方法名称即可(如ThreadStart(StartListenint))
/// </summary>
public partial class Server : Form
{
private const int maxPacket = 64 * 1024;//接收数据缓存区的大小64K
private TcpListener _tcp;//从Tcp网络客户端侦听连接
private Socket clientSocket;//套接字接口
private Thread clientService;//创建并控制线程,设置其优先级并获取其状态
private IPEndPoint listenPort;//将网络端点表示为IP地址和端口号
delegate void setTextString(string str);
public Server()
{
InitializeComponent();
}
/// <summary>
/// 关闭监听器
/// </summary>
public void listenClose()
{
if (_tcp != null)//判断监听器是否为空
{
_tcp.Stop();//关闭监听器
}
} private void Form1_Load(object sender, EventArgs e)
{
} /// <summary>
/// 监听的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMonitor_Click(object sender, EventArgs e)
{
string portParam;
//MessageBox.Show("请输入监听端口","提示",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
portParam = txtServePort.Text.Trim();
if (portParam != string.Empty)//判断输入的端口是否为空
{ if (int.Parse(portParam) < 1023 || int.Parse(portParam) > 65535)
{
MessageBox.Show("端口号输入不合法,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
txtServePort.Clear();
txtServePort.Focus();
}
else
{
try
{
listenPort = new IPEndPoint(IPAddress.Any, Convert.ToInt32(portParam));//将IpEndPoint实例化 Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //serverSocket.Bind(listenPort);
//serverSocket.Listen(100);
//serverSocket.BeginAccept(new AsyncCallback), Thread thr = new Thread(new ThreadStart(StartListening));//ThreadState:表示在线程上执行的方法
thr.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
} /// <summary>
/// 开始监听的方法
/// </summary>
/// <returns></returns>
private void StartListening()
{
_tcp = new TcpListener(listenPort);//实例化侦听连接并将所要监听的端口号以及IP放入侦听连接中
setText("IP:"+Convert.ToString(listenPort)+"\r\n");
_tcp.Start();
MessageBox.Show("服务器已启动......");
while (true)
{
try
{
Socket s = _tcp.AcceptSocket();
clientSocket = s;
clientService = new Thread(new ThreadStart(ServiceClient));//创建线程,并用ThreadStart执行ServiceClient这个方法
clientService.Start();//让该线程进行运行
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
} /// <summary>
/// 服务器客户端连接
/// </summary>
/// <returns></returns>
private void ServiceClient()
{
Socket client = clientSocket;
bool keepalive = true;
while (keepalive)
{
byte[] buffer = new Byte[60];
client.Receive(buffer);//接收数据将其写入buffer
string clientCommand = byteToHexStr(buffer);
clientCommand += "\r\n";
setText(clientCommand);
}
} /// <summary>
/// 将buffer中所接收的数据转化为字符串
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
private string byteToHexStr(byte[] buffer)
{
string returnStr = "";
if (buffer != null)
{
for (int i = 0; i <buffer.Length; i++)
{
returnStr += buffer[i].ToString("X2") + "";
}
}
return returnStr;
} /// <summary>
/// 获取值将该值赋给txtShow让其显示出来
/// </summary>
/// <param name="p"></param>
private void setText(string str)
{
if (txtShow.InvokeRequired)
{
setTextString sts = new setTextString(setText);//把setText方法进行委托一下
Invoke(sts, new object[] { str });//Invoke:在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托
}
else
{
txtShow.Text += str;
}
} /// <summary>
/// 发送的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnServerSend_Click(object sender, EventArgs e)
{
Socket cli = clientSocket;
string str=txtInput.Text.Trim();
SendToClient(cli,str);
} /// <summary>
/// 向客户端发送数据的方法
/// </summary>
/// <param name="cli"></param>
/// <param name="str"></param>
private static void SendToClient(Socket cli,string str)
{
Byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());//ToCharArray:将此实例中的字符复制到Unicode字符数组
cli.Send(sendBytes);
} /// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Server_FormClosing(object sender, FormClosingEventArgs e)
{
listenClose();
}
}
}问题(如图):
代码如下: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 服务器_Server
{
/// <summary>
/// 服务器:
/// delegate:委托的关键字
/// ThreadStart:当运行此方法时,该方法中的参数只要输入方法名称即可(如ThreadStart(StartListenint))
/// </summary>
public partial class Server : Form
{
private const int maxPacket = 64 * 1024;//接收数据缓存区的大小64K
private TcpListener _tcp;//从Tcp网络客户端侦听连接
private Socket clientSocket;//套接字接口
private Thread clientService;//创建并控制线程,设置其优先级并获取其状态
private IPEndPoint listenPort;//将网络端点表示为IP地址和端口号
delegate void setTextString(string str);
public Server()
{
InitializeComponent();
}
/// <summary>
/// 关闭监听器
/// </summary>
public void listenClose()
{
if (_tcp != null)//判断监听器是否为空
{
_tcp.Stop();//关闭监听器
}
} private void Form1_Load(object sender, EventArgs e)
{
} /// <summary>
/// 监听的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMonitor_Click(object sender, EventArgs e)
{
string portParam;
//MessageBox.Show("请输入监听端口","提示",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
portParam = txtServePort.Text.Trim();
if (portParam != string.Empty)//判断输入的端口是否为空
{ if (int.Parse(portParam) < 1023 || int.Parse(portParam) > 65535)
{
MessageBox.Show("端口号输入不合法,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
txtServePort.Clear();
txtServePort.Focus();
}
else
{
try
{
listenPort = new IPEndPoint(IPAddress.Any, Convert.ToInt32(portParam));//将IpEndPoint实例化 Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //serverSocket.Bind(listenPort);
//serverSocket.Listen(100);
//serverSocket.BeginAccept(new AsyncCallback), Thread thr = new Thread(new ThreadStart(StartListening));//ThreadState:表示在线程上执行的方法
thr.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
} /// <summary>
/// 开始监听的方法
/// </summary>
/// <returns></returns>
private void StartListening()
{
_tcp = new TcpListener(listenPort);//实例化侦听连接并将所要监听的端口号以及IP放入侦听连接中
setText("IP:"+Convert.ToString(listenPort)+"\r\n");
_tcp.Start();
MessageBox.Show("服务器已启动......");
while (true)
{
try
{
Socket s = _tcp.AcceptSocket();
clientSocket = s;
clientService = new Thread(new ThreadStart(ServiceClient));//创建线程,并用ThreadStart执行ServiceClient这个方法
clientService.Start();//让该线程进行运行
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
} /// <summary>
/// 服务器客户端连接
/// </summary>
/// <returns></returns>
private void ServiceClient()
{
Socket client = clientSocket;
bool keepalive = true;
while (keepalive)
{
byte[] buffer = new Byte[60];
client.Receive(buffer);//接收数据将其写入buffer
string clientCommand = byteToHexStr(buffer);
clientCommand += "\r\n";
setText(clientCommand);
}
} /// <summary>
/// 将buffer中所接收的数据转化为字符串
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
private string byteToHexStr(byte[] buffer)
{
string returnStr = "";
if (buffer != null)
{
for (int i = 0; i <buffer.Length; i++)
{
returnStr += buffer[i].ToString("X2") + "";
}
}
return returnStr;
} /// <summary>
/// 获取值将该值赋给txtShow让其显示出来
/// </summary>
/// <param name="p"></param>
private void setText(string str)
{
if (txtShow.InvokeRequired)
{
setTextString sts = new setTextString(setText);//把setText方法进行委托一下
Invoke(sts, new object[] { str });//Invoke:在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托
}
else
{
txtShow.Text += str;
}
} /// <summary>
/// 发送的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnServerSend_Click(object sender, EventArgs e)
{
Socket cli = clientSocket;
string str=txtInput.Text.Trim();
SendToClient(cli,str);
} /// <summary>
/// 向客户端发送数据的方法
/// </summary>
/// <param name="cli"></param>
/// <param name="str"></param>
private static void SendToClient(Socket cli,string str)
{
Byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());//ToCharArray:将此实例中的字符复制到Unicode字符数组
cli.Send(sendBytes);
} /// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Server_FormClosing(object sender, FormClosingEventArgs e)
{
listenClose();
}
}
}问题(如图):
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货