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多线程 TCP多线程](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
代码