网络编程主要是客户端与服务器之间的交互,与客户端有关的类是Socket,与服务器有关的类是ServerSocket。客户端与服务器之间的通信主要是通过字节流实现的,客户端Socket含有方法
- getInputStream()
- getOutputStream()
来获得流,而服务器通过accept()监听请求的客户端,该方法返回一个Socket类对象,这个对象就是访问的客户端,服务器通过这个Socket获得流,通过该流与客户端通信。
构造方法
客户端Socket类的构造方法为
- Socket(String host, int port)
- 第一个参数为域名地址或者IP地址
- 第二个参数为端口号
服务器端ServerSocket的构造方法为
客户端与服务器之间的简单通信
下面写一个简单的示例来进行客户端与服务器的通信。
客户端代码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1",8888); OutputStream os = socket.getOutputStream(); os.write("这里是客户端".getBytes()); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes); System.out.println(new String(bytes,0, len)); socket.close(); } }
|
服务器端代码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;
public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes); System.out.println(new String(bytes, 0, len)); OutputStream os = socket.getOutputStream(); os.write("收到了,谢谢".getBytes()); socket.close(); serverSocket.close(); }
}
|
先运行服务器端的程序,然后运行客户端的程序,服务器的输出为
客户端的输出为
文件上传
将本地的文件传输到服务器,其实原理就是文件的复制,之前我们写过,不过现在是使用网络流来实现,下面是代码,说明都在代码的注释中。
客户端代码
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class ClientUpload { public static void main(String[]args) throws IOException { InputStream fis = new FileInputStream("upload.pdf"); Socket client = new Socket("127.0.0.1", 8888); byte[] bytes = new byte[1024]; int len = 0; OutputStream os = client.getOutputStream(); while ((len = fis.read(bytes)) != -1) { os.write(bytes, 0, len); } client.shutdownOutput(); InputStream is = client.getInputStream(); while ((len = is.read(bytes)) != -1) { System.out.println(new String(bytes,0,len)); } fis.close(); client.close(); } }
|
服务器端代码
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;
public class ServerUpload { public static void main(String[] args) throws IOException { OutputStream fos = new FileOutputStream("uploadServer.pdf"); ServerSocket server = new ServerSocket(8888); Socket socket = server.accept(); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int len = 0; while ((len = is.read(bytes)) != -1) { fos.write(bytes); } OutputStream os = socket.getOutputStream(); os.write("已经上传完成".getBytes());
socket.close(); fos.close(); server.close(); } }
|