注意:服务器和客户端的代码所在包的名字要一模一样。新建了两个项目,一个是Server,一个是Client。
Server项目下:
package com.gongsi.cn.ch3;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.gongsi.cn.ch3.User;
public class LoginThread extends Thread {
Socket socket = null;
OutputStream out = null;
InputStream in = null;
ObjectInputStream ois = null;
User user = null;
OutputStreamWriter writer = null;
BufferedWriter bw = null;
public LoginThread(Socket socket) {
this.socket = socket;
}
public void run() {
// 2.打开socket的相关输入流
try {
out = socket.getOutputStream();
in = socket.getInputStream();
// 3.从网络 读入 数据
ois = new ObjectInputStream(in);
user = (User) ois.readObject();
if (user!= null) {
System.out.println("服务器接收到客户端的数据:用户名" + user.getName() + "\t" + "密码是:" + user.getPassword());
}
// 3.写出信息到网络
writer = new OutputStreamWriter(out);
bw = new BufferedWriter(writer);
if (user.getName().equals("张三") && user.getPassword().equals("111")) {
bw.write("登录成功");
bw.flush();// 把残余的数据全部倒出
} else {
bw.write("登录失败");
bw.flush();// 把残余的数据全部倒出
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 4.关资源
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
package com.gongsi.cn.ch3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//服务器读入客户端传过来的信息
public class Server {
public static void main(String[] args) throws IOException, Exception {
ServerSocket serverSocket=new ServerSocket(9999);//服务器端的快递点
System.out.println("服务器已经启动,监听端口号是:9999");
//1.跟客户端建立链接 socket 客户端的快递点
try {
while (true) {
Socket socket=serverSocket.accept();
LoginThread loginThread=new LoginThread(socket);
loginThread.start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
serverSocket.close();
}
}
}
package com.gongsi.cn.ch3;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String 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;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public User() {
super();
}
}
Client项目下
package com.gongsi.cn.ch3;
//客户端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.ShutdownChannelGroupException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception, IOException {
//1.建立跟服务器链接
Socket socket=new Socket("localhost",9999);
//2.通过socket得到输出流,输入流
OutputStream out=socket.getOutputStream();
InputStream in= socket.getInputStream();
ObjectOutputStream oos=new ObjectOutputStream(out);
User user=new User();
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
user.setName(input.next());
System.out.println("请输入密码:");
user.setPassword(input.next());
//3.写出信息到网络
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("客户端接收到服务器的信息是:"+strs);
}
//4.关资源
oos.close();
br.close();
isr.close();
in.close();
out.close();
socket.close();
}
}
package com.gongsi.cn.ch3;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String 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;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public User() {
super();
}
}
然后先运行服务器端的代码,再运行客户端的代码就可以啦。可以多个客户端访问服务器,可以和小伙伴互相试试。注意,客户端的地址和端口号要写对;如果你想连别人的服务器发送信息,那你的客户端的包名要和别人服务器的包名一样。要在User类加上这一句。最后最后,还要注意你在客户端引用的User是不是和你的客户端代码在同一个包下,如果是复制的很有可能会出错。
private static final long serialVersionUID = 1L;