TCP多线程

来源:互联网 发布:蝴蝶机夹胸 知乎 编辑:程序博客网 时间:2024/05/29 18:10

1.服务器端采用循环接收用户的socket请求,每接收到一个socket连接请求,就开启一个新的thread来处理。(MyServer)

ServerSocket ss = new ServerSocket(30000);
  while(true)
  {
  //服务器端不断接收来自用户端的socket连接请求,
  //把每个socket放入队列,给每个socket开一个线程处理
   Sockets = ss.accept();
   socketList.add(s);
   newThread(new ServerThread(s)).start();

2.服务器线程采用循环不断接受客户端发来的数据,并把读到的内容向每个socket发送一次(ServerThread)

while ((content = readFromClient()) != null)
   {
   //遍历socketList里的每个socket,将读到的内容向每个Socket发送一次
    for(Sockets : MyServer.socketList)
    {
     OutputStreamos = s.getOutputStream();
     os.write((content+ "\n").getBytes("utf-8"));
    }
   }

 

  在读取过程中,如果捕捉到异常,则证明该socket对应的客户端已经关闭,就将它删除

catch(IOException e)
  {
  //如果出现异常,就说明客户端已经关闭,把这个线程除去
   MyServer.socketList.remove(s);
  }

3.一个按钮,两个文本框。按钮用来发送,一个文本框用来输入要发送的内容,另一个显示发送了的信息(参考QQ的feel)

客户端主程序文件,负责1.建立与服务器的socket连接,建立一个客户端线程。2.文本框里输入要发送的内容,点击send按钮后,向服务器发送消息。3.创建一个Handler,来处理消息,如果收到来自子线程的消息,就把它显示在文本框中。

 //创建一个handler对象,来处理消息
       handler = new Handler()
       {

   @Override
   publicvoid handleMessage(Message msg) {
    super.handleMessage(msg);
    //如果消息来自于子线程
    if(msg.what== 0x123)
    {
     //在show文本框显示得到的消息
     show.append("\n"+ msg.obj.toString());
    }
   }
       };
       
       //向服务器发起socket请求,并开启一个客户端线程ClientThread
       try
       {
        s = new Socket("222.18.174.135",30000);
        new Thread(newClientThread(s,handler)).start();
        os = s.getOutputStream();
       }
       catch(Exception e)
       {
        e.printStackTrace();
       }
       
       //send按钮相关操作
       send.setOnClickListener(new OnClickListener() {
   public voidonClick(View arg0) {
    try
    {
     //向服务器端发消息
     os.write((input.getText().toString()+ "\r\n").getBytes("utf-8"));
     input.setText("");
    }
    catch(Exceptione)
    {
     e.printStackTrace();
    }
   }
  });
    }

 

4.客户端线程负责循环接收来自服务器端的消息,一旦接收到,就发message给客户端主程序

while((content = br.readLine()) != null)
   {
    Messagemsg = new Message();
    msg.what= 0x123;
    msg.obj= content;
    handler.sendMessage(msg);
   }

 5.记得要去写允许访问网络的permission啊,还有,每次调代码的时候,要改IP

TCP多线程

代码

0 0