Android版多线程聊天室——ServerSocket和Socket的使用

该博客介绍了一个Android应用,通过ServerSocket和Socket实现多线程聊天室。每个客户端利用Socket连接服务器,发送并接收消息。服务器端用ServerSocket创建TCP服务器,对每个连接的客户端启动新线程进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    每一个手机客户端使用Socket与服务器端进行通信,把消息发送给服务器,并监听和显示服务器端发来的消息。

    使用ServerSocket创建TCP服务器端,服务器为每个Socket单独创建一个线程用来与客户端进行通信。

服务器端代码如下:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class SimpleServer {
	public static ArrayList sockets = new ArrayList();

	public static void main(String[] agrs) {

		ServerSocket serverSocket = null;
		try {

			serverSocket = new ServerSocket(3000);
			while (true) {
				Socket socket = serverSocket.accept();
				System.out.println("get a socket:" + socket.getInetAddress().getHostAddress());
				sockets.add(socket);
				new Thread(new ServerThread(socket)).start();

			}
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread implements Runnable {
	Socket socket;
	BufferedReader bufferedReader;// 该socket对应的字符输入流

	public ServerThread(Socket s) throws IOException {
		this.socket = s;
		bufferedReader = new BufferedReader(new InputStreamReader(
				socket.getInputStream(), "utf-8"));// 初始化输入流
	}

	@Override
	public void run() {
		try {
			String chat = null;
			while ((chat = bufferedReader.readLine()) != null) {
				for (Socket s : SimpleServer.sockets) {
					s.getOutputStream().write((chat + "\n").getBytes("utf-8"));
				}

			}

		} catch (IOException e) {
			SimpleServer.sockets.remove(socket);
			System.out.println("remove a socket");
			e.printStackTrace();
		}

	}

}




手机端代码如下:

package com.example.multithreadclient;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ClientActivity extends ActionBarActivity {
	public static final int SEND_FLAG = 0x124;
	public static final int RECIVE_FLAG = 0x123;
	public static final int TIMEOUT_FLAG = 0x111;
	
	
	TextView showTextView;
	EditText sendEditText;
	Button sendButton;
	UIHander uiHander;
	ClientThread clientThread;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
			
		showTextView = (TextView) findViewById(R.id.showTextView);
		sendEditText = (EditText) findViewById(R.id.sendText);
		sendButton = (Button) findViewById(R.id.sendButton);
		
		uiHander = new UIHander(showTextView);
		
		clientThread = new ClientThread(uiHander);
		new Thread(clientThread).start();
		
		sendButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				
				String str = sendEditText.getText().toString();
				if (str==null || str.equals("")) {
					return;
				}
				str = clientThread.hostAddress + ":"+str;
				Message message = new Message();
				message.what = 0x124;
				Bundle data = new Bundle();
				data.putString("send", str);
				message.setData(data);
				clientThread.threadHander.sendMessage(message);
				
				sendEditText.setText("");
			}
		});
		
		

	}

	 class UIHander extends Handler {
		 TextView show;
		 public UIHander(TextView view) {
			this.show = view;
		}
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == 0x123) {

				show.append("\n" + msg.getData().getString("context"));
			}
			
			if (msg.what == 0x111) {
				show.setText("服务器连接失败!");
			}

		}

	}

}
package com.example.multithreadclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.example.multithreadclient.ClientActivity.UIHander;

public class ClientThread implements Runnable {

	UIHander uiHander;
	public ClientThreadHander threadHander;
	public String hostAddress = "???";
	Socket socket = null;
	OutputStream os = null;
	BufferedReader br = null;

	public ClientThread(UIHander hander) {
		this.uiHander = hander;
	}

	class ClientThreadHander extends Handler {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == 0x124) {
				try {
					os.write((msg.getData().getString("send") + "\r\n")
							.getBytes("utf-8"));
				} catch (SocketTimeoutException e) {
					uiHander.sendEmptyMessage(0x111);
				} catch (UnsupportedEncodingException e) {
					uiHander.sendEmptyMessage(0x111);
				} catch (IOException e) {
					uiHander.sendEmptyMessage(0x111);
				}
			}
		}

	}

	@Override
	public void run() {

		try {

			socket = new Socket();
			socket.connect(new InetSocketAddress("192.168.0.104", 3000), 4000);
			hostAddress = socket.getLocalAddress().getHostAddress();
			os = socket.getOutputStream();
			br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));

			// 新建一个子线程用来监听服务器端的输入数据
			new Thread() {

				@Override
				public void run() {
					String content = null;

					try {
						while ((content = br.readLine()) != null) {
							Message msg = new Message();
							Bundle bundle = new Bundle();
							bundle.putString("context", content);
							msg.what = 0x123;
							msg.setData(bundle);
							uiHander.sendMessage(msg);

						}
					} catch (IOException e) {

						e.printStackTrace();
					}

				}

			}.start();

			Looper.prepare();
			threadHander = new ClientThreadHander();
			Looper.loop();

		} catch (SocketTimeoutException e) {

			uiHander.sendEmptyMessage(0x111);
		} catch (UnknownHostException e) {
			uiHander.sendEmptyMessage(0x111);
		} catch (IOException e) {
			uiHander.sendEmptyMessage(0x111);
		}

	}

}


    

        

        

            
        

        

            
        

        



效果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值