例子:
1.这是一个客户端与一个服务器的对接:
服务器端:
public class Server {
// 服务器读入客户端传过来的信息
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8799);
// 1.服务器端跟客户端建立连接
System.out.println("服务器已经启动,监听端口号是:8799");
Socket socket = serverSocket.accept();
// 2.打开socket 的相关输入流
InputStream in = socket.getInputStream();
// 2.通过socket得到输出流
OutputStream out = socket.getOutputStream();
// 3.读取数据
// 乱码处理
InputStreamReader isr = new InputStreamReader(in);
// 提高读取速度
BufferedReader br = new BufferedReader(isr);
String strs;
while ((strs = br.readLine()) != null) {
System.out.println("服务器端接收端客户端的信息是:" + strs);
}
socket.shutdownInput();//暂时禁用输入流
// 乱码处理
OutputStreamWriter osw = new OutputStreamWriter(out);
// 提高读取速度
BufferedWriter bw = new BufferedWriter(osw);
// 3.写出信息到网络
bw.write("hello,client!");
bw.flush();// 把残留的数据全部倒出
// 4.关闭资源
br.close();
isr.close();
in.close();
bw.close();
osw.close();
out.close();
socket.close();
serverSocket.close();
}
}
客户端:
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 1.建立跟服务器端连接
Socket socket = new Socket("192.168.92.28", 8799);
// 2.打开socket 的相关输入流
InputStream in = socket.getInputStream();
// 2.通过socket得到输出流
OutputStream out = socket.getOutputStream();
// 乱码处理
OutputStreamWriter osw = new OutputStreamWriter(out);
// 提高读取速度
BufferedWriter bw = new BufferedWriter(osw);
// 3.写出信息到网络
bw.write("hello,Server!");
bw.flush();// 把残留的数据全部倒出
socket.shutdownOutput();//暂时禁用输出流
// 3.读取数据
// 乱码处理
InputStreamReader isr = new InputStreamReader(in);
// 提高读取速度
BufferedReader br = new BufferedReader(isr);
String strs;
while ((strs = br.readLine()) != null) {
System.out.println("客户端接收端服务器端的信息是:" + strs);
}
// 4.关闭资源
br.close();
isr.close();
in.close();
bw.close();
osw.close();
out.close();
socket.close();
}
}
2.这是多个客户端与多个服务器端的对接:使用了线程实现Runnable接口的方法
客户端:多线程实现多个客户端登录功能
//客户端
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 1.建立跟服务器端连接
Socket socket = new Socket("localhost", 8799);
CSRunnable testRunnable = new CSRunnable(socket);
Thread t = new Thread(testRunnable);
t.start();
}
}
//客户端实现Runnable接口方法
public class CSRunnable implements Runnable {
Socket socket = null;// 表示生产了某个产品
public CSRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 2.打开socket 的相关输入流
InputStream in = socket.getInputStream();
// 2.通过socket得到输出流
OutputStream out = socket.getOutputStream();
// 3.写出信息到网络
ObjectOutputStream oos = new ObjectOutputStream(out);
User user = new User();
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
user.setName(input.next());
System.out.print("请输入密码:");
user.setPassword(input.next());
oos.writeObject(user);// 把整个对象写出到网络
oos.flush();// 把残留的数据全部倒出
socket.shutdownOutput();// 暂时禁用输出流
// 3.读取数据
// 乱码处理
InputStreamReader isr = new InputStreamReader(in);
// 提高读取速度
BufferedReader br = new BufferedReader(isr);
String strs;
while ((strs = br.readLine()) != null) {
System.out.println("客户端接收端服务器端" + Thread.currentThread().getName() + "的信息是:" + strs);
}
// 4.关闭资源
br.close();
isr.close();
in.close();
oos.close();
out.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端:
//服务器端
public class Server {
// 服务器读入客户端传过来的信息
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器已经启动,监听端口号是:9999");
try {
while (true) {//来一个客户端,虚拟一个服务器
// 1.服务器端跟客户端建立连接
Socket socket = serverSocket.accept();
//创建线程
CSRunnable testRunnable = new CSRunnable(socket);
Thread t = new Thread(testRunnable);
t.start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
serverSocket.close();
}
}
}
//服务端实现Runnable接口方法
public class CSRunnable implements Runnable {
Socket socket = null;//
public CSRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 2.打开socket 的相关输入流
InputStream in = socket.getInputStream();
// 2.通过socket得到输出流
OutputStream out = socket.getOutputStream();
// 3.从网络读取数据
ObjectInputStream ois = new ObjectInputStream(in);
User user = (User) ois.readObject();
if (user!=null) {
System.out.println("服务器端" + Thread.currentThread().getName() + "接收端客户端的数据:用户名为:" + user.getName() + ";密码是:"
+ user.getPassword());
}
socket.shutdownInput();// 暂时禁用输入流
// 乱码处理
OutputStreamWriter osw = new OutputStreamWriter(out);
// 提高读取速度
BufferedWriter bw = new BufferedWriter(osw);
if (socket != null) {
if (user.getName().equals("张三") && user.getPassword().equals("111")) {
bw.write(user.getName() + "欢迎您,登录成功!");
bw.flush();// 把残留的数据全部倒出
} else if (user.getName().equals("李四") && user.getPassword().equals("111")) {
bw.write(user.getName() + "欢迎您,登录成功!");
bw.flush();// 把残留的数据全部倒出
} else if (user.getName().equals("王五") && user.getPassword().equals("111")) {
bw.write(user.getName() + "欢迎您,登录成功!");
bw.flush();// 把残留的数据全部倒出
} else if (user.getName().equals("小二") && user.getPassword().equals("111")) {
bw.write(user.getName() + "欢迎您,登录成功!");
bw.flush();// 把残留的数据全部倒出
} else {
bw.write("登录失败!");
bw.flush();// 把残留的数据全部倒出
}
}
// 4.关闭资源
bw.close();
osw.close();
out.close();
ois.close();
in.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
共用实体用户类:
public class User implements Serializable{
private static final long serialVersionUID = 1L;//加上版本号
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;
}
}
运行结果:
客户端
服务器端