服务器端
public class MyServer {
private static int port = 30000;
public static Map<String,Socket> socketMap = new LinkedHashMap<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(port);
while (true){
System.out.println("服务器已启动,等待客户端的链接。。。");
//阻塞方法 等待客户端的连接
Socket socket = serverSocket.accept();
System.out.println("客服端已经链接。。。");
//给每个连接的客户端建立子线程
new Thread(new ServerThread(socket)).start();
}
}
}
服务器端子线程
public class ServerThread implements Runnable {
private Socket clientSocket;
//socket所对应的输入流
InputStream br = null;
//目标socket所对应的输出流
OutputStream outputStream = null;
public ServerThread(Socket clientSocket) {
this.clientSocket = clientSocket;
try {
br = clientSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//读取从客户端发送过来的数据
InputStream inputStream = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
String data = new String(buffer, 0, len);
System.out.println(data);
//判断是否是注册id 并将id 和socket存入Map
if (data.startsWith("#")) {
MyServer.socketMap.put(data, clientSocket);
} else {
//将数据发送给指定的客户端
String[] split = data.split("#");
System.out.println("#" + split[0]);
//根据id获取指定的socket
Socket c = MyServer.socketMap.get("#" + split[0]);
//获取socket的输出流 并将消息写入
outputStream = c.getOutputStream();
outputStream.write(split[1].getBytes());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客服端子线程
public class ClientThread implements Runnable {
//向UI线程发射消息的handler
private Handler handler;
//socket所对应的输入输出流
InputStream reader = null;
OutputStream writer = null;
private Socket s;
//接受Ui线程消息的Handler;
public Handler revHandler;
public ClientThread() {
super();
}
public ClientThread(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
try {
s = new Socket("192.168.0.103",30000);
reader = s.getInputStream();
writer = s.getOutputStream();
//启动一条子线程来读取服务器响应的数据
new Thread(new Runnable() {
@Override
public void run() {
String content = null;
try {
byte[] buffer = new byte[1024];
int len = -1;
while ((len = reader.read(buffer)) != -1) {
String data = new String(buffer, 0, len);
//每当读取到来自服务器的消息之后,发送消息通知程序界面显示数据
Message message = new Message();
message.what = 0x123;
message.obj = data;
handler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//为当前线程初始化Looper
Looper.prepare();
revHandler= new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0x345){
try {
//将获取的信息发送给服务器
writer.write(msg.obj.toString().getBytes());
}catch (Exception e){
e.printStackTrace();
}
}
}
};
Looper.loop();
}catch (SocketTimeoutException e1){
System.out.printf("网络连接超时");
}
catch (IOException e){
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客服端Activity
public class MainActivity extends AppCompatActivity {
private Handler handler;
EditText regis_text;
EditText target_text;
EditText content_text;
Button regis_button;
Button send_button;
Button unConnect_button;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化view
initView();
//主线程handler 将获取到的服务器的信息展示在textview上
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0x123){
Log.d("main",msg.obj.toString());
textView.append(msg.obj.toString());
}
}
};
//创建客服端子线程并开启子线程
final ClientThread c = new ClientThread(handler);
new Thread(c).start();
//注册id
regis_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(regis_text.getText().toString().trim().isEmpty()){
Toast.makeText(MainActivity.this,"注册信息不能为空", Toast.LENGTH_SHORT).show();
}else {
String regisContent = "#" + regis_text.getText().toString().trim();
Message message = new Message();
message.what = 0x345;
message.obj = regisContent;
c.revHandler.sendMessage(message);
regis_text.setText("");
}
}
});
//发送消息 必须指定接收方的id
send_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(target_text.getText().toString().trim().isEmpty()||content_text.getText().toString().trim().isEmpty()){
Toast.makeText(MainActivity.this,"信息不能为空", Toast.LENGTH_SHORT).show();
}else {
String content = target_text.getText().toString().trim()+"#" + content_text.getText().toString().trim();
Message message = new Message();
message.what = 0x345;
message.obj = content;
c.revHandler.sendMessage(message);
target_text.setText("");
content_text.setText("");
}
}
});
unConnect_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
private void initView() {
regis_text = (EditText) findViewById(R.id.regis);
target_text = (EditText) findViewById(R.id.target);
content_text = (EditText) findViewById(R.id.content);
regis_button = (Button) findViewById(R.id.regis_button);
send_button = (Button) findViewById(R.id.send_button);
unConnect_button = (Button) findViewById(R.id.unconnect_button);
textView = (TextView) findViewById(R.id.content_text);
}
}