>  기사  >  Java  >  C#(소켓) 비동기 소켓 코드 예제

C#(소켓) 비동기 소켓 코드 예제

黄舟
黄舟원래의
2016-12-22 13:29:341496검색

비동기 클라이언트 소켓 예제


다음 예제 프로그램은 서버에 연결하는 클라이언트를 생성합니다. 클라이언트는 비동기 소켓으로 구축되므로 서버의 응답을 기다리는 동안 클라이언트 애플리케이션의 실행이 중단되지 않습니다. 애플리케이션은 서버에 문자열을 보낸 다음 서버가 반환한 문자열을 콘솔에 표시합니다.

C#

System.Net 사용,
System.Net.Sockets 사용,
System.Text 사용;
// 원격 장치로부터 데이터를 수신하기 위한 상태 개체.
public class StateObject {
// 클라이언트 소켓.
public Socket workSocket = null
// 수신 버퍼 크기. >public const int BufferSize = 256;
// 수신 버퍼
public byte[] buffer = new byte[BufferSize]
// 수신된 데이터 문자열
);
}
public class AsynchronousClient {
// 원격 장치의 포트 번호
private const int port = 11000;// ManualResetEvent 인스턴스 신호 완료
static ManualResetEvent connectDone =
new ManualResetEvent(false);
private static ManualResetEvent sendDone =
new ManualResetEvent(false)
private static ManualResetEvent receiveDone =
new ManualResetEvent(false ); // 원격 장치의 응답
private static String response = String.Empty;
private static void StartClient() {
// 원격 장치에 연결합니다.
// 소켓에 대한 원격 끝점을 설정합니다.
//
// 원격 장치의 이름은 "host.contoso.com"입니다.
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso. com");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint RemoteEP = new IPEndPoint(ipAddress, port);
// TCP/IP 소켓을 생성합니다.
소켓 클라이언트 = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
// 원격 엔드포인트에 연결합니다.
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();// 원격 장치에 테스트 데이터를 보냅니다.
Send(client,"This is a test")
sendDone.WaitOne(); 🎜>// 원격 장치로부터 응답을 받습니다.
receiveDone.WaitOne()
// 콘솔에 응답을 씁니다. received : {0}", response);
// 소켓을 해제합니다.
client.Shutdown(SocketShutdown.Both);
client.Close();
} catch(예외 e) {
Console.WriteLine(e.ToString());
}
}
private static void ConnectCallback(IAsyncResult ar) {
try {
// 상태에서 소켓 검색 object.
Socket client = (Socket) ar.AsyncState;
// 연결을 완료합니다.
client.EndConnect(ar)
Console.WriteLine("소켓이 {0}에 연결됨",
client.RemoteEndPoint.ToString());
// 연결이 이루어졌다는 신호
connectDone.Set()
} catch (Exception e) {
Console.WriteLine (e.ToString());
}
}
private static void receive(Socket client) {
try {
// StateObject를 생성합니다. state = new StateObject();
state.workSocket = client
// 원격 장치로부터 데이터 수신을 시작합니다.
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, 
new AsyncCallback(ReceiveCallback), state); 
} catch (예외 e) { 
Console.WriteLine(e.ToString()); 


private static void ReceiveCallback(IAsyncResult ar) { 
시도 { 
// 비동기 상태 객체에서 상태 객체와 클라이언트 소켓을 검색하세요.
//. 
StateObject 상태 =(StateObject) ar.AsyncState; 
소켓 클라이언트 = state.workSocket; 
//원격 기기에서 데이터를 읽습니다. 
int bytesRead = client.EndReceive(ar); 
if (bytesRead > 0) { 
// 더 많은 데이터가 있을 수 있으므로 지금까지 받은 데이터를 저장하세요. 
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); 
// 나머지 데이터를 가져옵니다. 
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0, 
new AsyncCallback(ReceiveCallback), state); 
} else { 
// 모든 데이터가 도착했습니다. 이에 대해 응답해 보세요. 
if (state.sb.Length > 1) { 
응답 = state.sb.ToString(); 

// 모든 바이트가 수신되었음을 알립니다. 
receiveDone.Set(); 

} catch (예외 e) { 
Console.WriteLine(e.ToString()); 


private static void Send(소켓 클라이언트, 문자열 데이터) { 
// ASCII 인코딩을 사용하여 문자열 데이터를 바이트 데이터로 변환합니다. 
byte[] byteData = Encoding.ASCII.GetBytes(data); 
// 원격 기기로 데이터 전송을 시작합니다. 
client.BeginSend(byteData, 0, byteData.Length, 0, 
new AsyncCallback(SendCallback), client); 

private static void SendCallback(IAsyncResult ar) { 
try { 
// 상태 객체에서 소켓을 검색합니다. 
소켓 클라이언트==(소켓)ar.AsyncState; 
// 원격 기기로 데이터 전송을 완료합니다. 
int bytesSent = client.EndSend(ar); 
Console.WriteLine("{0}바이트를 서버로 보냈습니다.", bytesSent); 
// 모든 바이트가 전송되었음을 알립니다. 
sendDone.Set(); 
} catch (예외 e) { 
Console.WriteLine(e.ToString()); 


public static int Main(String[] args) { 
StartClient(); 
0을 반환합니다. 


异步服务器套接字示例 하측면의 인터넷은 示例程序创建一个接收来自客户端的连接请求的服务器.该服务器是用异步套接字生成的, 
因此在等待来自客户端的连接时不挂起服务器应用程序该字符.串,然后将该字符串回显到客户端。来自客户端 字符串必须包含字符串“”, 
以发流表示消息结尾的信号。 



  




C#
 复system代码 

시스템 사용; 
System.Net 사용; 
System.Net.Socket 사용; 
System.Text 사용; 
System.Threading 사용; 
// 클라이언트 데이터를 비동기적으로 읽기 위한 상태 개체
공개 클래스 StateObject{
//클라이언트 소켓. 
공용 소켓 workSocket = null; 
// 수신 버퍼의 크기입니다. 
공용 상수 int BufferSize = 1024; 
// 버퍼를 수신합니다. 
공개 바이트[] 버퍼 = 새 바이트[BufferSize]; 
// 수신된 데이터 문자열입니다. 
공개 StringBuilder sb = 새 StringBuilder(); 

공용 클래스 AsynchronousSocketListener { 
//스레드 신호. 
공개 정적 ManualResetEvent allDone = 새 ManualResetEvent(false); 
public AsynchronousSocketListener() { 

public static void StartListening() { 
// 수신 데이터용 데이터 버퍼입니다. 
바이트[] 바이트 = 새 바이트[1024]; 
//소켓의 로컬 엔드포인트를 설정합니다. 
// 리스너를 실행하는 컴퓨터의 DNS 이름은
// 'host.contoso.com'입니다. 
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
IPAddress ipAddress = ipHostInfo.AddressList[0]; 
IPEndPoint localEndPoint = 새 IPEndPoint(ipAddress, 11000); 
// TCP/IP 소켓을 만듭니다. 
소켓 리스너 = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp ); 
//소켓을 로컬 엔드포인트에 바인딩하고 들어오는 연결을 수신합니다. 
시도해 보세요 { 
listener.Bind(localEndPoint); 
listener.Listen(100); 
while(true) { 
// 이벤트를 비신호 상태로 설정합니다. 
allDone.Reset(); 
// 비동기 소켓을 시작하여 연결을 수신합니다. 
Console.WriteLine("연결을 기다리는 중..."); 
listener.BeginAccept( 
new AsyncCallback(AcceptCallback), 
리스너 ); 
// 계속하기 전에 연결이 이루어질 때까지 기다리세요. 
allDone.WaitOne(); 

} catch (예외 e) { 
Console.WriteLine(e.ToString()); 

Console.WriteLine("n계속하려면 Enter를 누르세요..."); 
Console.Read(); 

public static void AcceptCallback(IAsyncResult ar) { 
// 메인 스레드에 계속하라는 신호를 보냅니다. 
allDone.Set(); 
// 클라이언트 요청을 처리하는 소켓을 가져옵니다. 
소켓 리스너=(Socket) ar.AsyncState; 
소켓 처리기==listener.EndAccept(ar); 
// 상태 객체를 생성합니다. 
StateObject 상태 = 새 StateObject(); 
state.workSocket = 핸들러; 
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, 
new AsyncCallback(ReadCallback), state); 

공개 정적 void ReadCallback(IAsyncResult ar){ 
문자열 콘텐츠 = String.Empty; 
// 비동기 상태 개체에서 상태 개체와 핸들러 소켓을 검색합니다
//. 
StateObject 상태 =(StateObject) ar.AsyncState; 
소켓 핸들러 = state.workSocket; 
//클라이언트 소켓에서 데이터를 읽습니다.  
int bytesRead = handler.EndReceive(ar); 
if (bytesRead > 0) { 
// 더 많은 데이터가 있을 수 있으므로 지금까지 받은 데이터를 저장하세요. 
state.sb.Append(Encoding.ASCII.GetString( 
state.buffer,0,bytesRead)); 
// 파일 끝 태그를 확인하세요. 거기에 없으면
//더 많은 데이터를 읽어보세요. 
콘텐츠 = state.sb.ToString(); 
if (content.IndexOf("") > -1) { 
// 모든 데이터를 
// 클라이언트에서 읽었습니다. 콘솔에 표시하세요. 
Console.WriteLine("소켓에서 {0}바이트를 읽습니다. n 데이터: {1}",
content.Length, content ); 
// 데이터를 클라이언트에 다시 에코합니다. 
보내기(처리기, 콘텐츠); 
} else { 
// 모든 데이터가 수신되지는 않았습니다. 더 많은 것을 얻으세요. 
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
new AsyncCallback(ReadCallback), state); 



private static void Send(소켓 핸들러, 문자열 데이터) { 
// ASCII 인코딩을 사용하여 문자열 데이터를 바이트 데이터로 변환합니다. 
byte[] byteData = Encoding.ASCII.GetBytes(data);
// 원격 장치로 데이터 전송을 시작합니다.
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback (SendCallback), handler);
}
private static void SendCallback(IAsyncResult ar) {
try {
// 상태 객체에서 소켓을 검색합니다.
소켓 핸들러 = (소켓) ar.AsyncState;
// 원격 장치로 데이터 전송을 완료합니다.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("클라이언트에 {0}바이트를 보냈습니다.", bytesSent );
handler.Shutdown(SocketShutdown.Both);
handler.Close()
} catch(예외 e) {
Console.WriteLine(e.ToString()); }
}
public static int Main(String[] args) {
StartListening();
return 0;
}
}

위는 C#입니다. (소켓) 비동기 소켓 코드 예제, 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)에 주목하세요!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.