使用多线程来实现网络模拟聊天,服务器可以接受多个客户端,分别介绍如下,有一个服务器,有个实现服务器里面的操作方法,有一个客户端,有一个客户用户类,来存储信息、下面是具体的代码,有不足的地方希望提出
package cn.bdqn.test;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器
* @author xiaobubu
*2019年3月10日下午1:13:34
*/
public class WeChatSever {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket clientServer = null;
/*InputStream is =null;
ObjectInputStream ois = null;
OutputStream os =null;*/
//1.指定客户端
while(true) {
try {
serverSocket = new ServerSocket(9874);
clientServer = serverSocket.accept();
System.out.println("来自客户端"+clientServer.getInetAddress()+"的请求");
} catch (Exception e) {
e.printStackTrace();
}
//2.等待客户端的请求
MyThread myThread = new MyThread(clientServer);
Thread thread = new Thread(myThread);
thread.start();
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package cn.bdqn.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**客户端
* @author xiaobubu
*2019年3月8日下午10:05:28
*/
public class WeChatClient {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
ObjectOutputStream oos = null;
InputStream is = null;
BufferedReader br = null;
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = input.next();
System.out.println("请输入密码");
String password = input.next();
//创建对象
User user = new User(name,password );
try {
//1.指定服务器的端口IP
socket = new Socket("localhost", 9874);
//2.获取输出流
os = socket.getOutputStream();
//3.获取序列化输出流(用来传输对象)
oos = new ObjectOutputStream(os);
//4.开始发送用户的登录数据
oos.writeObject(user);
//----------------接受响应-----------------------
//1.停止输出
socket.shutdownOutput();
//2.获取输入流
is = socket.getInputStream();
//3.将输出的内容转换成高效字符符输入流读写字节
br = new BufferedReader(new InputStreamReader(is));
//4.将读取的字节转换成字符串,通过循环读取
String str = "";
while((str = br.readLine())!=null) {
System.out.println(str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关流,先开的后关
try {
br.close();
is.close();
oos.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package cn.bdqn.test;
import java.io.Serializable;
/**
* 用户类(序列化接口必须实现Serializable)
* @author xiaobubu
*2019年3月8日下午9:48:13
*/
public class User implements Serializable{
private String name;
private String password;
public User() {
super();
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User name="+name+",password="+password;
}
}
package cn.bdqn.test;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyThread implements Runnable {
//成员变量
private Socket socket;
//方法重载用来创建对象
public MyThread(Socket socket) {
this.socket = socket;
}
//方法重写,来执行线程里面的内容
@Override
public void run() {
InputStream is;
String response = "";
try {
is = socket.getInputStream();
//4.创建序列化输入流(传入对象)
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println("用户登录的数据为"+user);
//6.开始判断用户是否登陆成功
if("admin".equals(user.getName()) && "123123".equals(user.getPassword())){
response = "登录成功";
}else {
response = "登录失败";
}
} catch (Exception e1) {
e1.printStackTrace();
}
//--------------------开始做出相应-------------------------
OutputStream os = null;
try {
//1.停止用户数据输入
socket.shutdownInput();
//2.获取输出流,
os = socket.getOutputStream();
//3.开始进行输出给用户反馈的登录信息
os.write(response.getBytes());//将判断的信息字符串,转化为字节通过字节输出流进行输出
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}