网络编程之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(); } }