首先实现客户端
1.新建一个客户端对象socket,绑定服务器
2.使用socket对象的getOutputStream方法来获取网络字节输出流OutputStream对象
3.使用OutputStream对象的Write方法来给服务器发送数据
4.使用socket对象的getInputStream方法来获取网络字节输入流InputStream对象
5.使用网络字节输入流InputStream的方法read,来读取服务器发送来的数据
6.释放资源
public static void main(String[] args) throws IOException {
//1.新建一个客户端对象socket,绑定服务器
Socket socket = new Socket("127.0.0.1", 8888);
//2.使用socket对象的getOutputStream方法来获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//3.使用OutputStream对象的Write方法来给服务器发送数据
os.write("你好,服务器!".getBytes());
//4.使用socket对象的getInputStream方法来获取网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//5.使用网络字节输入流InputStream的方法read,来读取服务器发送来的数据
byte[]bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//6.释放资源
os.close();
}
实现服务器:
1.创建服务器Server对象,且绑定客户端指定的的端口号
2.使用ServerSocket对象的的accept方法来获取到客户端的对象Socket
3.使用Socket对象的方法getInputStream来获取网络字节输入流InputStream对象
4.使用网络字节输入流InputStream对象的方法read,读取客户端发送来的数据
5.使用Socket对象的方法getOutputStream来获取网络字节输入流OutputStream对象
6.使用网络字节输出流OutputStream对象的方法write,给客户端发送数据
7.释放资源(socket,server)
public static void main(String[] args) throws IOException {
//1.创建服务器Server对象,且绑定客户端指定的的端口号
ServerSocket server = new ServerSocket(8888);
//2.使用ServerSocket对象的的accept方法来获取到客户端的对象Socket
Socket socket = server.accept();
//3.使用Socket对象的方法getInputStream来获取网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//4.使用网络字节输入流InputStream对象的方法read,读取客户端发送来的数据
byte[]bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//5.使用Socket对象的方法getOutputStream来获取网络字节输入流OutputStream对象
OutputStream os = socket.getOutputStream();
//6.使用网络字节输出流OutputStream对象的方法write,给客户端发送数据
os.write("你好,客户端,我是服务器.".getBytes());
//7.释放资源(socket,server)
socket.close();
server.close();
}
对服务器端进行优化:
1.通过使用while循环来使服务器进程不会在提供完成某一次服务后自动关闭.
2.使用多线程来使服务器端具备并发服务能力.
代码实现如下:
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
//使用循环来使程序一直运行下去
while (true){
Socket socket = serverSocket.accept();
//增加效率,使用多线程
new Thread(new Runnable() {
@Override
public void run() {
try{
InputStream is = socket.getInputStream();
File file = new File("C:\\Users\\asus\\Desktop\\upload");
if (!file.exists()){
file.mkdirs();
}
//生成文件名字
FileOutputStream fos = new FileOutputStream("C:\\Users\\asus\\Desktop\\upload\\"+System.currentTimeMillis()+".jpg");
//接收客户端发送到内容
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1){
fos.write(bytes,0,len);
}
//告诉客户端上传完成
OutputStream os = socket.getOutputStream();
os.write("文件上传成功!".getBytes());
//释放资源
fos.close();
socket.close();
}catch (Exception e){
System.out.println(e);
}
}
}).start();
}
}
注意:
1.如果想要实现交互,需把客户端创建socket对象时的端口号与服务器的端口号保持一致.
2.需要先开启客户端程序,然后开启服务器端程序,顺序不可颠倒.