2012-01-06 2 views
1

클라이언트 (Android) - 서버 (C#) 응용 프로그램을 쓰고 있습니다. 여기에서 코드를 얻습니다. How to make client on Android listen to server on C#? 클라이언트에서 서버로 메시지를 보내고 서버에서 클라이언트로 메시지를 보낼 때마다 (서버 측 소켓을 닫음) Everythings이 정상적으로 작동합니다. 자, 내가 원하는 건 : 서버에 메시지를 보내고 서버로부터 메시지를받은 다음 서버에 다시 메시지를 보냅니다. 메시지를 보낼 때 서버가 멈 춥니 다. 전송 후 서버 측 소켓을 닫으면 처리 오류가 발생하고 서버에서 데이터를 보낼 수 있습니다.보낼 때 서버가 멈추는 경우가 있습니다.

내 서버 코드는 다음과 같습니다

/*************************************SERVER*****************************/ 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 

namespace SERVER2 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      try 
      { 
       IPAddress ipAd = IPAddress.Parse("192.168.2.102"); 

       TcpListener myList = new TcpListener(ipAd, 18001); 

       myList.Start(); 

       Console.WriteLine("The server is running at port 18001..."); 
       Console.WriteLine("The local End point is :" + 
            myList.LocalEndpoint); 
       Console.WriteLine("Waiting for a connection....."); 
       m: 
       Socket s = myList.AcceptSocket(); 
       Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); 

       byte[] b = new byte[100]; 
       int k = s.Receive(b); 

       char cc = ' '; 
       string test = null; 
       Console.WriteLine("Recieved1..."); 
       for (int i = 0; i < k - 1; i++) 
       { 
        cc = Convert.ToChar(b[i]); 
        test += cc.ToString(); 
       } 
       Console.WriteLine("Received characters1: "+test); 

       ASCIIEncoding asen = new ASCIIEncoding(); 
       s.Send(asen.GetBytes("The string was recieved by the server.")); 
       Console.WriteLine("\nSent Acknowledgement"); 
       //s.Close(); <-if i enable this, i get a dispose error 

       k = s.Receive(b);//i get dispose error here 

       cc = ' '; 
       test = null; 
       Console.WriteLine("Recieved2..."); 
       for (int i = 0; i < k - 1; i++) 
       { 
        cc = Convert.ToChar(b[i]); 
        test += cc.ToString(); 
       } 
       Console.WriteLine("Received characters2: " + test); 

       /* clean up */ 
       goto m; 
       s.Close(); 
       myList.Stop(); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error..... " + e.Message); 
      } 
      Console.ReadLine(); 
     } 

    } 
} 

내 클라이언트 코드는 다음과 같습니다

/******************************CLIENT*****************************************/ 
    Socket socket = null; 
     try 
     { 
      Toast.makeText(context,"IP: "+ip+" port: "+port,10000).show(); 
      InetAddress serverAddr = InetAddress.getByName(ip); 
      socket = new Socket(serverAddr, port); 
     } 
     catch (UnknownHostException e1) 
     { 
      Toast.makeText(context,"UnknownHostException ",10000).show(); 
     } 
     catch (IOException e1) 
     { 
      Toast.makeText(context,"IOException ",10000).show(); 
     } 

     String message = "1"; 

     PrintWriter out = null; 
     BufferedReader in = null; 

     try { 
      Log.d("TCP", "C: Sending: '" + message + "'"); 

      /*write*/ 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
      out.println(message); 
      out.flush(); 
      /*read*/ 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String text = ""; 
      String finalText = ""; 
      while ((text = in.readLine()) != null) 
      { 
       finalText += text; 
       } 
      Toast.makeText(context, "FinalText: "+finalText, 10000).show(); 
      Log.d("TCP", "C: Sent."); 
      Log.d("TCP", "C: Done."); 
      in.close();   

      /*write*/ 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
      out.println(message); 
      out.flush(); 
     } catch(Exception e) { 
      Log.e("TCP", "S: Error", e); 
     } finally { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

감사가 진행!

답변

0

문제는 클라이언트가 서버에서 메시지를 받았을 때 while 부분이 무한 루프로 들어갔다는 것입니다. 나는이 같은 내 응용 프로그램을 수정

내 클라이언트 부분 :

try 
     { 
      Toast.makeText(context,"IP: "+ip+" port: "+port,10000).show(); 
      InetAddress serverAddr = InetAddress.getByName(ip); 
      socket = new Socket(serverAddr, port); 
     } 
     catch (UnknownHostException e1) 
     { 
      Toast.makeText(context,"UnknownHostException ",10000).show(); 
     } 
     catch (IOException e1) 
     { 
      Toast.makeText(context,"IOException ",10000).show(); 
     } 

     String message = "HELLO FROM CLIENT"; 

     PrintWriter out = null; 
     BufferedReader in = null; 

     try { 
      Log.d("TCP", "C: Sending: '" + message + "'"); 

      /*write*/ 
      OutputStream ostr=socket.getOutputStream(); 
      OutputStreamWriter outputstr=new OutputStreamWriter(ostr); 
      BufferedWriter buffw=new BufferedWriter(outputstr); 
      out = new PrintWriter(buffw ,true); 
      out.println("HELLO 1 FROM CLIENT"); 

      /*read - i modify to this*/ 
      InputStreamReader reader=new InputStreamReader(socket.getInputStream()); 
      char[] bytesreceived=new char[50]; 
      reader.read(bytesreceived , 0, 50); 
      String text=""; 
      for (int i=0;i<bytesreceived.length;i++) 
      { 
       text+=bytesreceived[i]; 
      } 
      Toast.makeText(context, "Received1: "+text.trim(), 10000).show(); 
      Log.d("IdealLog","Received1: "+text.trim()); 

      /*write*/ 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
      out.println("HELLO 2 FROM CLIENT"); 

      /*read*/ 
      reader=new InputStreamReader(socket.getInputStream()); 
      bytesreceived=new char[50]; 
      reader.read(bytesreceived , 0, 50); 
      text=""; 
      for (int i=0;i<bytesreceived.length;i++) 
      { 
       text+=bytesreceived[i]; 
      } 
      Toast.makeText(context, "Received2: "+text.trim(), 10000).show(); 
      Log.d("IdealLog","Received2: "+text.trim()); 

     } catch(Exception e) { 
      Log.e("TCP", "S: Error", e); 
     } finally { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

내 서버 측 코드 : 이제

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace SocketServer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPEndPoint ip = new IPEndPoint(IPAddress.Any, 18001); 
      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      socket.Bind(ip); 
      socket.Listen(10); 
      Console.WriteLine("Waiting for a client..."); 
      Socket client = socket.Accept(); 
      IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; 
      Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port); 



      string welcome = "HELLO 1 FROM SERVER"; 
      byte[] data = new byte[200]; 
      int receiveddata=client.Receive(data); 
      Console.WriteLine("Received data from CLIENT1: {0}", System.Text.ASCIIEncoding.ASCII.GetString(data).Trim()); 



      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] data2 = new byte[200]; 
      data2 = asen.GetBytes(welcome); 
      int sentdata=client.Send(data2, data2.Length, SocketFlags.None); 
      Console.WriteLine("Sent data from SERVER: {0}", welcome); 



      byte[] data3 = new byte[200]; 
      Console.WriteLine("Receiving data from CLIENT : {0}", "..."); 
      client.Receive(data3); 


      Console.WriteLine("Received data from CLIENT2: {0}", System.Text.ASCIIEncoding.ASCII.GetString(data3).Trim()); 
      byte[] data4 = new byte[200]; 
      data4 = asen.GetBytes("HELLO 2 FROM SERVER"); 
      sentdata = client.Send(data4, data4.Length, SocketFlags.None); 

      client.Close(); 
      socket.Close(); 


      Console.WriteLine("Disconnected from {0}", clientep.Address); 



      Console.ReadLine(); 
     } 
    } 
} 

, 모든 끊지 않고 잘 작동한다. 유일한 문제는 파일 수신을 위해 작동하는지 여부를 알 수 없다는 것입니다.

0

당신은 TCP 클라이언트의 흐름 .. 예를 여기에서 찾을 수 있습니다 사용해야 http://msdn.microsoft.com/de-de/library/system.net.sockets.tcplistener.aspx

을 그리고, 고토 제발 사용하지 마십시오. goto m; 코드 끝내기 시간 초과가 발생했는지 또는 다른 검사를하는지 while 루프를 사용하여 코드를 둘러 쌉니다.

서버가 멈추는 이유는 수신하기 위해 100 바이트를 대기하기 때문입니다.

+0

내가 말했듯이 스트림을 사용하려고했지만 메시지를 보낼 때이 부분에 중단됩니다. stream.Write (msg, 0, msg.Length); 아무것도 클라이언트 측에서 작성되지 않습니다. 내가 스트림을 추가하면.close() while 루프에서 처리 된 오류가 발생하지만 서버에서 메시지를 가져옵니다. – user1127431

0

처리 오류가 발생하는 이유는 s.close()이 소켓을 닫은 후 다음 s.Receive()이 닫힌 소켓에서 읽으려고하기 때문입니다.

또한 자바 코드에서 in.close();이 표시 될 수 있습니다. 기본 소켓을 닫을 수 있습니다. 그것을 주석으로 처리하고 매달린 문제를 해결하는지 확인하십시오.

C#의 전문가는 아니지만 소켓 프로그래밍을 담당했습니다.

기본적으로 원하는 것은 1 + n 개의 스레드입니다.

연결을 허용하는 하나의 스레드.

Socket s = myList.AcceptSocket();이 반환하는 각 소켓에 대해 데이터를 송수신하고 소켓에서 메시지를 처리하기위한 스레드가 필요합니다. 두 개의 스레드를 사용할 수도 있습니다 (하나는 보내는 스레드, 하나는받는 스레드 (비동기식 스레드)).

+0

나는 in.close() 부분을 주석 처리하려고했지만 행운은 없었다. 앱은 여전히 ​​전송시 중단됩니다. 어디서 소켓을 넣어야합니까? s = myList.AcceptSocket(); ? – user1127431

관련 문제