在上个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 {
//1创建Socket
Socket socket=new Socket("192.168.0.103", 6666);
//2获取输出流
OutputStream os=socket.getOutputStream();
//3边读取文件,边发送
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);
}
//4关闭
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 {
//1创建ServerSocket
ServerSocket listener=new ServerSocket(6666);
//2侦听,接收客户端请求
System.out.println("服务器已启动.........");
Socket socket=listener.accept();
//3获取输入流
InputStream is=socket.getInputStream();
//4边读取,边保存
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);
}
//5关闭
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 {
//1加载属性文件
public static Properties loadProperties() {
//1创建属性集合
Properties properties=new Properties();
//2判断文件是否存在
File file=new File("users.properties");
if(file.exists()) {
FileInputStream fis=null;
try {
fis = new FileInputStream(file);
properties.load(fis);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

return properties;
}

//2保存属性文件

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) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
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 {
//1创建Serversocket
ServerSocket listener=new ServerSocket(6666);
//2调用accept方法
System.out.println("注册服务器已启动......");
Socket socket=listener.accept();
//3获取输入输出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
//4接收客户端发送的数据{id : 1001, name :tom, pwd :123, age : 20 }
String json=br.readLine();
//id : 1001, name :tom, pwd :123, age : 20
String[] infos=json.substring(1, json.length()-1).split(",");
String id=infos[0].split(":")[1];
//5加载属性文件
Properties properties=Tools.loadProperties();
//6判断
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 {
//1创建Serversocket
ServerSocket listener=new ServerSocket(7777);
//2调用accept方法
System.out.println("登录服务器已启动......");
Socket socket=listener.accept();
//3获取输入输出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
//4接收客户端发送的数据{id : 1001, pwd :123}
String json=br.readLine();
//id : 1001 pwd :123
String[] infos=json.substring(1, json.length()-1).split(",");
String id=infos[0].split(":")[1];
//5加载属性文件
Properties properties=Tools.loadProperties();
//6判断是否存在
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 {
// 1创建Socket
Socket socket = new Socket("192.168.0.103", 6666);
// 2获取流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
// 3获取用户信息
String json = getRegistInfo();
// 4发送
bw.write(json);
bw.newLine();
bw.flush();
// 5接收
String reply = br.readLine();
System.out.println("服务器回复:" + reply);
// 6关闭
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();
// {id : 1001, name :tom, pwd :123, age : 20 }
String json = "{id:" + id + ",name:" + name + ",pwd:" + pwd + ",age:" + pwd + "}";
return json;
}

public static void login() throws Exception {
// 1创建Socket
Socket socket = new Socket("192.168.0.103", 7777);
// 2获取流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
// 3获取用户信息
String json = getLoginInfo();
// 4发送
bw.write(json);
bw.newLine();
bw.flush();
// 5接收
String reply = br.readLine();
System.out.println("服务器回复:" + reply);
// 6关闭
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();
// {id : 1001, name :tom, pwd :123, age : 20 }
String json = "{id:" + id+",pwd:"+ pwd+"}";
return json;
}
}

以上即为TCP用户登录注册功能实现