在上个TCP案例中,我们利用字节流进行一些字符的传输,那么这个案例,我们将尝试利用IO流进行文件传输。
客户端代码编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.io.FileInputStream; import java.io.OutputStream; import java.net.Socket;
public class TcpFileClient { public static void main(String[] args) throws Exception { Socket socket=new Socket("192.168.0.103", 6666); OutputStream os=socket.getOutputStream(); FileInputStream fis=new FileInputStream("d:\\001.jpg"); byte[] buf=new byte[1024*4]; int count=0; while((count=fis.read(buf))!=-1) { os.write(buf,0,count); } fis.close(); os.close(); socket.close(); } }
|
整体来说变化不大,只是变化输入流为FileInputStream
服务端代码编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.io.FileOutputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;
public class TcpFileServer { public static void main(String[] args) throws Exception { ServerSocket listener=new ServerSocket(6666); System.out.println("服务器已启动........."); Socket socket=listener.accept(); InputStream is=socket.getInputStream(); FileOutputStream fos=new FileOutputStream("d:\\002.jpg"); byte[] buf=new byte[1024*4]; int count=0; while((count=is.read(buf))!=-1) { fos.write(buf,0,count); } fos.close(); is.close(); socket.close(); listener.close(); } }
|
以上为TCP文件传输案例实现 单纯这样似乎文章太短,本人不是那种灌水的人,接下来实现一个用户登录注册的系统
TCP用户登录注册功能实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties;
public class Tools { public static Properties loadProperties() { Properties properties=new Properties(); File file=new File("users.properties"); if(file.exists()) { FileInputStream fis=null; try { fis = new FileInputStream(file); properties.load(fis); } catch (Exception e) { e.printStackTrace(); }finally { if(fis!=null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
}
return properties; }
public static void saveProperties(String json) { String[] infos=json.substring(1, json.length()-1).split(","); String id=infos[0].split(":")[1]; FileOutputStream fos=null; try { fos=new FileOutputStream("users.properties",true); Properties properties=new Properties(); properties.setProperty(id, json); properties.store(fos, ""); } catch (Exception e) { e.printStackTrace(); }finally { if(fos!=null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
} }
|
这里我们采用Properties集合保存用户文件 接下来编写注册类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Properties;
public class RegistThread extends Thread{ @Override public void run() { try { ServerSocket listener=new ServerSocket(6666); System.out.println("注册服务器已启动......"); Socket socket=listener.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8")); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8")); String json=br.readLine(); String[] infos=json.substring(1, json.length()-1).split(","); String id=infos[0].split(":")[1]; Properties properties=Tools.loadProperties(); if(properties.containsKey(id)) { bw.write("此用户已存在..."); }else { Tools.saveProperties(json); bw.write("注册成功"); } bw.newLine(); bw.flush(); bw.close(); br.close(); socket.close(); listener.close(); } catch (IOException e) { e.printStackTrace(); } } }
|
接下来编写登录类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| mport java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Properties;
public class LoginThread extends Thread { @Override public void run() { try { ServerSocket listener=new ServerSocket(7777); System.out.println("登录服务器已启动......"); Socket socket=listener.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8")); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8")); String json=br.readLine(); String[] infos=json.substring(1, json.length()-1).split(","); String id=infos[0].split(":")[1]; Properties properties=Tools.loadProperties(); if(properties.containsKey(id)) { String pwd=infos[1].split(":")[1]; String value=properties.getProperty(id); String[] arr=value.substring(1, value.length()-1).split(","); String pwd2=arr[2].split(":")[1]; if(pwd.equals(pwd2)) { bw.write("登录成功"); }else { bw.write("密码错误"); } }else { bw.write("用户名或密码错误"); } bw.newLine(); bw.flush(); bw.close(); br.close(); socket.close(); listener.close(); } catch (IOException e) { e.printStackTrace(); } } }
|
此时编写好这两个类后,在服务端启动这两个类的线程即可
1 2 3 4 5 6
| public class UserServer { public static void main(String[] args) { new RegistThread().start(); new LoginThread().start(); } }
|
接下来编写客户端,实现客户端与服务端交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner;
public class UserClient { public static void main(String[] args) throws Exception { System.out.println("---------请选择 1 注册 2 登录-----------"); Scanner input = new Scanner(System.in); int choice = input.nextInt(); switch (choice) { case 1: regist(); break; case 2: login(); default: break; } }
public static void regist() throws Exception { Socket socket = new Socket("192.168.0.103", 6666); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8")); String json = getRegistInfo(); bw.write(json); bw.newLine(); bw.flush(); String reply = br.readLine(); System.out.println("服务器回复:" + reply); bw.close(); br.close(); socket.close(); }
public static String getRegistInfo() { Scanner input = new Scanner(System.in); System.out.println("请输入用户编号"); int id = input.nextInt(); System.out.println("请输入姓名"); String name = input.next(); System.out.println("请输入密码"); String pwd = input.next(); System.out.println("请输入年龄"); int age = input.nextInt(); String json = "{id:" + id + ",name:" + name + ",pwd:" + pwd + ",age:" + pwd + "}"; return json; }
public static void login() throws Exception { Socket socket = new Socket("192.168.0.103", 7777); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8")); String json = getLoginInfo(); bw.write(json); bw.newLine(); bw.flush(); String reply = br.readLine(); System.out.println("服务器回复:" + reply); bw.close(); br.close(); socket.close(); } public static String getLoginInfo() { Scanner input = new Scanner(System.in); System.out.println("请输入用户编号"); int id = input.nextInt(); System.out.println("请输入密码"); String pwd = input.next(); String json = "{id:" + id+",pwd:"+ pwd+"}"; return json; } }
|
以上即为TCP用户登录注册功能实现