public class TCPServer {
public static void main(String[] args) throws IOException {
// 创建服务端对象, 并指定要使用的端口号
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端已启动...")
// 调用accept方法来等待客户端连接
Socket clientSocket = serverSocket.accept();
// 通过客户端socket对象获取网络字节输入流, 用来读取数据
InputStream is = clientSocket.getInputStream();
// 通过流读取数据, 一次读一个byte数组, 因为发送的字符串内容少, 所以一个数组读一次就够了
byte[] bytes = new byte[1024];
int len;
len = is.read(bytes);
// 将读取到的字节数组转换为字符串, 读到多少转换多少, 不要全转
String s = new String(bytes, 0, len);
//System.out.println("[服务端收到信息]:来自" + clientSocket.getInetAddress().getHostAddress());
System.out.println("[服务端收到信息]:" + s);
// 通过客户端socket对象获取网络字节输出流, 用来发送数据
OutputStream os = clientSocket.getOutputStream();
os.write("收到谢谢!".getBytes());
// 关闭
clientSocket.close();
serverSocket.close();
}
public class TCPClient {
public static void main(String[] args) throws IOException {
// 1. 创建客户端Socket对象, 指定要连接的服务端的IP地址和端口号
// 创建Socket对象时, 会自动去连接服务端, 如果服务端没有启动, 或IP地址或端口错误, 则抛异常: java.net.ConnectException: Connection refused: connect
Socket socket = new Socket("127.0.0.1", 8888); // 127.0.0.1 表示自己电脑的IP地址
// 2. 获取网络字节输出流对象
OutputStream os = socket.getOutputStream();
// 3. 通过网络字节输出流对象发送(写)数据
os.write("你好服务器".getBytes());
// 获取网络字节输入流对象, 接收服务器返回的数据
InputStream is = socket.getInputStream();
byte[] bytes = new byte[0124];
int len;
len = is.read(bytes);
// 将读取到的字节转换为字符串
String s = new String(bytes, 0, len);
System.out.println("[客户端收到的数据]:" + s);
// 释放资源(关闭Socket同时会关闭流对象)
socket.close();
}
public class FileUploadClient {
public static void main(String[] args) throws IOException{
/*
1. 读取磁盘文件, 发送到服务端
*/
// 创建文件字节输入流对象, 用来读取文件
FileInputStream fis = new FileInputStream("day11\\小岳岳.jpg"); // 指向要上传的图片文件
// 创建客户端Socket对象, 连接服务端的地址
Socket socket = new Socket("127.0.0.1", 9999);
// 获取网络字节输出流, 用来向服务端发送数据
OutputStream os = socket.getOutputStream();
// 边读磁盘文件, 边向服务端发送数据. 一次读写一个byte数组
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
// 读到多少数据, 就写多少
os.write(bytes, 0, len);
}
/*
2. 读取服务端返回的信息, 打印出来
*/
// 获取网络字节输入流, 用来读取服务端返回的上传结果
InputStream is = socket.getInputStream();
// 边读服务器返回的数据, 边转换为字符串打印. 一次读一个byte数组
// 因为bytes数组和len上面已经定义过了, 所以我们可以直接使用
while ((len = is.read(bytes)) != -1) { // 注意!! 这里是用网络输入流读, 不要把对象写错
// 读到多少转换多少
String s = new String(bytes, 0, len);
System.out.print(s);
}
/*
3. 释放资源
*/
fis.close(); // 自己创建的文件流要关闭
socket.close(); // 网络流通过socket来关闭
}
}
public class FileUploadServer {
public static void main(String[] args) throws IOException {
/*
服务端接收上传数据, 写到服务端的磁盘
*/
// 创建服务端
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("文件上传服务端已启动....");
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
// 创建上传文件的目录
File uploadDir = new File("day11\\upload");
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
// 获取网络字节输入流, 用来读取客户端发来的文件数据
InputStream is = clientSocket.getInputStream();
// 创建文件字节输出流, 用来向服务端磁盘写文件数据
FileOutputStream fos = new FileOutputStream(uploadDir + "\\小岳岳.jpg");
// 一次读写一个字节数组
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
// 读多少, 写杜少
fos.write(bytes, 0, len);
}
/*
服务端向客户端回写上传成功
*/
clientSocket.getOutputStream().write("上传成功".getBytes());
/*
释放资源
*/
fos.close();
clientSocket.close();
serverSocket.close();
}
}
public class WebServer {
public static void main(String[] args) throws IOException {
// 创建服务端ServerSocket
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Web服务器已启动...");
// 循环接收浏览器请求
while (true) {
Socket clientSocket = serverSocket.accept();
// 在子线程中来读取请求的文件返回给浏览器
new Thread(new Runnable() {
@Override
public void run() {
try {
// 先获取网络字节输入流, 用来读取浏览器的请求
InputStream is = clientSocket.getInputStream();
// 将网络字节输入流转换为缓冲字符输入流, 便于读取一样字符串
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 读取一行字符串
String line = br.readLine();
// 按照空格切割
String[] arr = line.split(" ");
// 获取中间的元素, 并去掉开头的/ 得到html文件的路径
String htmlPath = arr[1].substring(1);
// 创建文件字节输入流, 用于读取html文件内容
FileInputStream fis = new FileInputStream(htmlPath);
// 获取网络字节输出流, 用于向浏览器回写文件内容
OutputStream os = clientSocket.getOutputStream();
// 先回写固定的HTTP响应行和响应头
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type: text/html\r\n".getBytes());
os.write("\r\n".getBytes());
// 然后再边读边回写文件
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
// 关流释放资源
fis.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |