概念性的东西上一篇文章已经介绍了,下面直接通过两个例子来演示。
客户端(发送数据和接收服务端的数据):必须先启动服务器
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public ClientDemo() {
}
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 8888); // 指定要访问的ip和端口号
// 通过reader来读取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 通过writer来向服务端发送数据
PrintStream writer = new PrintStream(socket.getOutputStream());
System.out.println(reader.readLine()); // 读取服务数据
writer.println("我想咨询一下"); // 向服务写入数据
socket.close(); // 关闭socket,最好在finally中关闭
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务器端(发送数据和接收服务端的数据):
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServiceDemo {
public ServiceDemo() {
}
public static void main(String[] args) {
new Thread() {
public void run() {
try {
final ServerSocket socket = new ServerSocket(8888);// 指定端口号
while (true) { // 不断接受客户端请求 因为有多个客户端 ,需要请求 只有一个服务器端
Socket accept = socket.accept(); // 接受客户端的请求
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream())); // 获取客户端输入流
PrintStream ps = new PrintStream(accept.getOutputStream());// 获取客户端输出流
ps.println("可以啊");
System.out.println(br.readLine());
// socket.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
控制台:
例子二:向服务端传文件:
服务端:
package Socket;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
public static void main(String[] args) {
/**
* 先从客户端发文件名到服务端,服务端判断是否有该文件 没有的话服务端通知客户端,可以上传文件了,客户端上传文件,服务端接收文件。
*/
new Thread() {
public void run() {
try {
ServerSocket sockets = new ServerSocket(12345);
Socket socket = sockets.accept();
InputStream is = socket.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream());
String name = bf.readLine();
// 创建文件夹 封装成file对象,判断存在
// 判断文件是否存在,存在就退出
File f = new File("update");
f.mkdir();
File file = new File(f, name);
if (file.exists()) {
ps.println("存在");
socket.close();
return;
} else {
ps.print("不存在");
}
// 从网络读取数据 存储到本地
FileOutputStream fis = new FileOutputStream(file);
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != 1) {
fis.write(b, 0, len);
}
fis.close();
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
客户端:
package Socket;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class FileClient {
public static void main(String[] args) {
// 获取文件的路径 验证是否是文件夹 和文件是否存在
File file = getFile();
// 发送文件名到服务器
try {
Socket socket = new Socket("127.0.0.1", 12345);
BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(file.getName());
// 接收结果 如果文件存在则 直接退出 否则 发文件到服务器
String result = bf.readLine();
if (result.equals("存在")) {
System.out.println("您上传的文件存在 ,请不要重复上传");
socket.close();
return;
}
//发送文件到服务器
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[8888];
int len;
while ((len = fis.read(b)) != -1) {
ps.write(b, 0, len);
}
ps.close();
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static File getFile() {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个文件路径:");
while (true) {
String str = input.nextLine();
File f = new File(str);
if (!f.exists()) {
System.out.println("您输入的文件路径不存在");
} else if (f.isDirectory()) {
System.out.println("你输入的是文件夹路径");
} else {
return f;
}
}
}
}