我正在尝试使用低级套接字在C#和java服务器中创建客户端服务器客户端应用程序: 该过程如下 他们点击登录或注册的充电客户界面 我打开我的套接字我将请求发送到我的服务器,我启动一个线程来不断读取服务器发送的数据:一切正常: 除了我必须保留我的套接字用于后续呼叫,我知道如何做:SOS 这是一段代码: /// t称为第一个呼叫服务器
public void Inscritpionidentification(string Commande,string UserID,string Password, string Nom,string prenom,string Email )
{
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2007);
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
ClientSocket.Connect(ipEnd);
if(ClientSocket.Connected)
{
//SendMsg(GetSequence()+NickName);
//Connect.Enabled=false;
if (Commande.Equals("/Identification"))
{
SendMsg("Identification");
}
if (Commande.Equals("/Account/Create"))
{
SendMsg("Inscription"));
}
}
}
catch (SocketException E)
{
MsgBox("Connection" + E.Message);
}
try
{
DataReceived = new Thread(new ThreadStart(CheckData)); // Read constantly gives the server sent
DataReceived.Start();
}
catch (Exception E)
{
MsgBox("Démarrage Thread" + E.Message);
}
while (UTF8Content==null) {
}
// Traitement
}
void SendMsg(string message)
{
byte[] msg = System.Text.Encoding.UTF8.GetBytes(message);
int DtSent = ClientSocket.Send(msg, msg.Length, SocketFlags.None);
if (DtSent == 0)
{
MsgBox("aucune donnèe n'as ete envoyé");
}
}
//// My thread
private void CheckData()
{
try
{
while(true)
{
if(ClientSocket.Connected)
{
if(ClientSocket.Poll(10,SelectMode.SelectRead) && ClientSocket.Available==0)
{
//La connexion a été clôturée par le serveur ou bien un problème
//réseau est apparu
MsgBox("La connexion au serveur est interrompue.Reessayez!!");
Thread.CurrentThread.Abort();
}
//Si la socket a des données à lire
if(ClientSocket.Available>0)
{
string messageReceived=null;
while(ClientSocket.Available>0)
{
try
{
byte[] msg=new Byte[ClientSocket.Available];
//Réception des données
ClientSocket.Receive(msg,0,ClientSocket.Available,SocketFlags.None);
messageReceived=System.Text.Encoding.UTF8.GetString(msg).Trim();
//On concatène les données reçues(max 4ko) dans une variable de la classe
UTF8Content+=messageReceived;
}
catch(SocketException E)
{
}
}
}
}
//On temporise pendant 10 millisecondes, ceci pour éviter
//que le micro processeur s'emballe
Thread.Sleep(10);
}
}
catch
{
//Ce thread étant susceptible d'être arrêté à tout moment
//on catch l'exception afin de ne pas afficher un message à l'utilisateur
Thread.ResetAbort();
}
}
//我在记录..par后对这个问题调用了这个函数我必须使用我在IdentificationInscription函数中实例化的同一个套接字,这显然是不可能的,即使该线程在执行中是toujour DataRecevied ...任何帮助将不胜感激,谢谢
public void ModifCompte(string UserID, string Password, string Nom, string prenom, string Email) {
SendMsg("Update"); // *Error Socket has null*
while (UTF8Content == null)
{
}
//My treatment
}
答案 0 :(得分:1)
查看单例模式https://msdn.microsoft.com/en-au/library/ff650316.aspx。
从本质上讲,你的单身人士会包裹你的插座。您只需创建套接字的单个实例,并通过单例引用它。
如何管理何时打开和关闭套接字取决于您。