应用案例1(使用字节流):
1.编写一个服务器端,和一个客户端
2.服务器端在9999端口监听
3.客户端连接到服务器端,发送"hello,server",然后退出
4.服务器段接收到 客户端发送的信息,输出,并退出
*ServerSocket可以创建多个Socket对象,ServerSocket只要有一次accept就会返回一个Socket对象

服务器端:
java
package com.javaWeb.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class SocketTCP01server {
public static void main(String[] args) throws IOException {
//1.在本机的9999端口监听,等待连接
//要求9999端口没有被占用,没有其他服务在监听此端口
ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
System.out.println("服务端在9999端口监听,等待链接....."); //此时端口已被占用,无法被其他程序使用
//2.当没有客户端链接9999端口时,程序会阻塞,等待连接
//如果有客户端链接,则会返回一个socket对象,程序继续执行
Socket socket = serverSocket.accept();
System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话
//3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
InputStream inputStream = socket.getInputStream();
//4.IO读取
byte buf[] = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1){
System.out.print(new String(buf,0,readLen)); //根据读取到的实际长度显示内容/字符串
}
//5.关闭流和socket
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端:
java
package com.javaWeb.Socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端,发送消息给服务端
public class SocketTCP01client {
public static void main(String[] args) throws IOException {
//1.链接服务端(ip,端口)
//链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
System.out.println("客户端socket返回=" + socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream
//3.通过输出流,写入数据到数据通道
outputStream.write("hello,server".getBytes());
//4.关闭流对象和socket,不然会造成资源浪费
outputStream.close();
socket.close();
System.out.println("客户端退出.....");
}
}
应用案例2(使用字节流):
1.编写一个服务器端,和一个客户端
2.服务器端在9999端口监听
3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出
4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出
*设置写入结束标记(没有这个标记就无法接收):
java
shutdownOutput();
服务器端:
java
package com.javaWeb.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP02server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
System.out.println("服务端在9999端口监听,等待链接....."); //此时端口已被占用,无法被其他程序使用
//2.当没有客户端链接9999端口时,程序会阻塞,等待连接
//如果有客户端链接,则会返回一个socket对象,程序继续执行
Socket socket = serverSocket.accept();
System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话
//3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
InputStream inputStream = socket.getInputStream();
//4.IO读取
byte buf[] = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.print(new String(buf, 0, readLen)); //根据读取到的实际长度显示内容/字符串
}
//5.获取socket相关联的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,client".getBytes());
//设置结束标记
socket.shutdownOutput();
//6.关闭流和socket
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端:
java
package com.javaWeb.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class SocketTCP02client {
public static void main(String[] args) throws IOException {
//1.链接服务端(ip,端口)
//链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
System.out.println("客户端socket返回=" + socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream
//3.通过输出流,写入数据到数据通道
outputStream.write("hello,server".getBytes());
//设置结束标记
socket.shutdownOutput();
//4,获取和socket关联的输入流,读取数据(字节)并显示
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1){
System.out.println(new String(buf,0,readLen));
}
//5.关闭流对象和socket,不然会造成资源浪费
inputStream.close();
outputStream.close();
socket.close();
System.out.println("客户端退出.....");
}
}
应用案例3(使用字符流):
1.编写一个服务器端,和一个客户端
2.服务器端在9999端口监听
3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出
4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出
*如果使用字符流,需要手动刷新,否则数据不会写入通道
java
bufferedWriter.flush();
*设置写入结束标记(没有这个标记就无法接收),也可以使用
java
writer.newLine();//要求对方使用readLine()方式读取才能读到
*这里需要使用转换流:

服务器端:
java
package com.javaWeb.Socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//使用字符流读写
public class SocketTCP03server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
System.out.println("服务端在9999端口监听,等待链接....."); //此时端口已被占用,无法被其他程序使用
//2.当没有客户端链接9999端口时,程序会阻塞,等待连接
//如果有客户端链接,则会返回一个socket对象,程序继续执行
Socket socket = serverSocket.accept();
System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话
//3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
InputStream inputStream = socket.getInputStream();
//4.IO读取,使用字符流
//使用InputStreamReader 将字节流inputStream转成字符流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//5.获取socket相关联的输出流,使用字符输出流方式回复
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello,client字符流....");
bufferedWriter.newLine();//插入一个换行符,表示回复内容结束
bufferedWriter.flush();
//6.关闭流和socket
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
}
}
客户端:
java
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
//使用字符流读写
public class SocketTCP03client {
public static void main(String[] args) throws IOException {
//1.链接服务端(ip,端口)
//链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
System.out.println("客户端socket返回=" + socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream
//3.通过输出流,写入数据到数据通道,使用字符流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello,server字符流.....");
bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,要求对方使用readLine方式读取
bufferedWriter.flush();//如果使用字符流,需要手动刷新
//4,获取和socket关联的输入流,读取数据(字节)并显示
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//5.关闭流对象和socket,不然会造成资源浪费
bufferedReader.close();//关闭外层流
bufferedWriter.close();
socket.close();
System.out.println("客户端退出.....");
}
}