TCP多线程

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

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

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

while ((content = readFromClient()) != null)
   {
   //遍历socketList里的每个socket,将读到的内容向每个Socket发送一次
    for(Socket s : MyServer.socketList)
    {
     OutputStream os = 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
   public void 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(new ClientThread(s,handler)).start();
         os = s.getOutputStream();
        }
        catch(Exception e)
        {
         e.printStackTrace();
        }
       
        //send按钮相关操作
        send.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {
    try
    {
     //向服务器端发消息
     os.write((input.getText().toString() + "\r\n").getBytes("utf-8"));
     input.setText("");
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }
   }
  });
    }

 

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

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

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

TCP多线程

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值