TCP编程
1、分别在服务器和客户端 创建ServerSocket和Socket;
2、在服务器端打开连接到Socket的输入/输出流;
3、按照协议,对socket进行读写操作;
4、关闭输入输出流,关闭socket;
客户端:
public class Client1 {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8899);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("我是客户端1111");
pw.flush();
socket.shutdownOutput();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
System.out.println("这里是客户端1111,服务器传来:"+info);
}
socket.shutdownInput();
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端:
public class Server {
public static void main(String[] args) {
try {
//1、创建服务器的serversocket等待客户端请求
ServerSocket serverSocket = new ServerSocket(8899);
System.out.println("***服务器已经启动,正在等待客户端请求***");
Socket socket = null;
int count = 0;
while(true){
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端一共请求了"+count+"次");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
public void run(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
System.out.println("这里是服务器,客户端传来:"+info);
}
socket.shutdownInput();
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("我是服务器,响应客户端的请求,请接收!");
pw.flush();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
pw.close();
os.close();
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP编程
服务器端:
1、创建DatagramSocket,指定端口号;
2、创建DatagramPacket;
3、接收客户端发送的数据信息;
4、读取数据。
public class UDPClient {
public static void main(String[] args) throws IOException {
//1、准备数据报的数据
byte[] buf = "我是客户端,我来请求了!!".getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 8889;
//2、创建数据报 包含准备发送的数据
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
//3、创建DatagramSocket, 准备发送数据
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
//接收响应
DatagramPacket packet2 = new DatagramPacket(buf, buf.length);
socket.receive(packet2);
String info = new String(buf, 0, buf.length);
System.out.println("我是客户端,服务器说:"+info);
socket.close();
}
}
客户端:
1、定义发送的数据信息(地址、端口号、数据);
2、创建DatagramPacket包含将要发送的信息;
3、创建DatagramSocket对象发送请求;
4、发送数据。
public class UDPServer {
public static void main(String[] args) throws IOException {
//1、创建DatagramSocket,指定端口号
DatagramSocket socket = new DatagramSocket(8889);
//2、创建数据报准备接收客户端请求的信息
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
int count=0; //记录请求次数
System.out.println("***服务器已经启动,正在等待客户端连接***");
while(true){
//3、接收请求数据
socket.receive(packet);
UDPServerThread thread = new UDPServerThread(socket, packet, buf);
thread.run();
count++;
System.out.println("请求次数:"+count);
}
}
}
public class UDPServerThread implements Runnable{
private DatagramSocket socket;
private byte[] buf;
private DatagramPacket packet;
public UDPServerThread(DatagramSocket socket, DatagramPacket packet, byte[] buf) {
this.socket = socket;
this.packet = packet;
this.buf = buf;
}
@Override
public void run() {
//4、读取数据
String info = new String(buf, 0, buf.length);
System.out.println("我是服务器,客户端说:"+info);
//响应数据
byte[] buf1 = "我是服务器, 我来响应你了!!".getBytes();
try {
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet2 = new DatagramPacket(buf1, buf1.length, packet.getAddress(), packet.getPort());
socket.send(packet2);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}