网络编程之TCP编程案例
需求1:请上传张图片到服务器。
客户端:
public static void main(String[] args) {
System.out.println("客户端启动。。。");
try {
Socket socket=new Socket("127.0.0.1",8000);
File file=new File("d:\\sxt2019\\danta.jpg");
FileInputStream fileInputStream=new FileInputStream(file);
OutputStream outputStream=socket.getOutputStream();
byte[] buf=new byte[512];
int len;
while((len=fileInputStream.read(buf))!=-1){
outputStream.write(buf, 0, len);
}
fileInputStream.close();
outputStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
服务器:
public static void main(String[] args) {
System.out.println("服务器启动。。。");
try {
ServerSocket serverSocket=new ServerSocket(8000);
Socket accept = serverSocket.accept();
InputStream inputStream=accept.getInputStream();
File file=new File("d:\\sxt2019\\abc\\danta.jpg");
FileOutputStream fileOutputStream=new FileOutputStream(file);
int len;
byte[] buf=new byte[512];
while((len=inputStream.read(buf))!=-1){
fileOutputStream.write(buf, 0, len);
}
inputStream.close();
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
需求2:在控制台输入用户名和密码,如果输入正确提示登录成功,否则登录失败。
User表:
package Day7.test03;
import java.io.Serializable;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
}
注意:服务器和客户端是分别运行在两个Eclipse上的。那么,表的工作路径,即第一行的包名,在服务器端和客户端两边的包名都要一致。否则当一边序列化对象后,另一边无法反序列化到对象,会报错。

服务器:
public static void main(String[] args) {
System.out.println("服务器启动。。。");
try {
ServerSocket serverSocket=new ServerSocket(9000);
Socket accept = serverSocket.accept();
//1.从客户端获取账号密码
InputStream inputStream=accept.getInputStream();
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
User user = (User) objectInputStream.readObject();
String username = user.getUsername();
String password = user.getPassword();
String msg;
if(username.equals("sxt") && password.equals("123")){
msg ="恭喜,登陆成功!";
}else {
msg="用户名或密码错误!";
}
accept.shutdownInput();
//2.向客户端传输提示信息
OutputStream outputStream = accept.getOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
dataOutputStream.writeUTF(msg);
accept.shutdownOutput();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端:
public static void main(String[] args) {
System.out.println("客户端启动。。。");
try {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
User user=new User(username, password);
Socket socket=new Socket("127.0.0.1",9000);
//1.向服务器传输账号密码
OutputStream outputStream=socket.getOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(user);
socket.shutdownOutput();
//2.从服务器返回提示信息
InputStream inputStream=socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(inputStream);
String msg=dataInputStream.readUTF();
System.out.println("提示信息:"+msg);
socket.shutdownInput();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在需求2的基础上,需求3:把服务器放到线程中,当程序启动后,服务器会一直工作。
服务器:
public static void main(String[] args) throws IOException {
System.out.println("服务器启动。。。");
ServerSocket serverSocket = new ServerSocket(9000);
while (true) {
Socket accept = serverSocket.accept();
LoginThread loginThread = new LoginThread(accept);
loginThread.start();
}
}
线程:
public class LoginThread extends Thread {
private Socket socket;
public LoginThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
// 1.从客户端获取账号密码
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
User user = (User) objectInputStream.readObject();
String username = user.getUsername();
String password = user.getPassword();
String msg;
if (username.equals("sxt") && password.equals("123")) {
msg = "恭喜,登陆成功!";
} else {
msg = "用户名或密码错误!";
}
socket.shutdownInput();
// 2.向客户端传输提示信息
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(msg);
socket.shutdownOutput();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
public static void main(String[] args) {
System.out.println("客户端启动。。。");
try {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
User user=new User(username, password);
Socket socket=new Socket("127.0.0.1",9000);
//1.向服务器传输账号密码
OutputStream outputStream=socket.getOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(user);
socket.shutdownOutput();
//2.从服务器返回提示信息
InputStream inputStream=socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(inputStream);
String msg=dataInputStream.readUTF();
System.out.println("提示信息:"+msg);
socket.shutdownInput();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

浙公网安备 33010602011771号