TCP 客户端程序与 TCP 服务器端程序的交互过程

1 服务器程序创建一个 ServerSocket ,然后电泳 accept 方法等待客户来连接。

2 客户端创建一个 Socket 并请求与服务器连接

3 服务器接受客户端请求,并创建一个行的 Socket 与该客户建立专线连接

4 简历了连接的两个 Socket 在一个单独的线程(有服务器程序创建)上对话。

5 服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤 2 到步骤 5 的程序

  Tcp 和 Udp 区别, Tcp 的程序,服务器端程序要先启动,等待客户来连接。而 Udp 是接受信息的一端要优先启动,然后发送者再启动。才能顺利发送信息。

例子一,一个普通的TCP传输的例子

服务器端(TCP区分服务器和链接端,这点上和UDP不一样)

package com.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPserver {
	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(8001);//创建一个服务器端Socket,在指定的端口8001上创建
			Socket socket = serverSocket.accept();//accpet这个方法可以获得一个连接的本服务器的socket对象。
			InputStream in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();
			String str = "欢迎你的到来,我是服务器";
			out.write(str.getBytes(), 0, str.getBytes().length);
			byte[] b = new byte[1024];
			BufferedReader reader=new BufferedReader(new InputStreamReader(in));
			System.out.println(reader.readLine());;			
			reader.close();
			out.close();
			socket.close();
			serverSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

链接端:

package com.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPsocket {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Socket socket=new Socket(InetAddress.getByName("192.168.18.4"),8001);
			InputStream in=socket.getInputStream();
			BufferedReader reader=new BufferedReader(new InputStreamReader(in));
			System.out.println(reader.readLine());
			OutputStream out=socket.getOutputStream();
			String str="我是连接端 你好服务器!";
			out.write(str.getBytes(), 0, str.getBytes().length);
			
			reader.close();
			out.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

TCP启动和UDP也不一样,TCP必须是服务器端先启动,链接端再启动要不然链接端会连接不上,有异常报出

例子二,发送一个javaBean对象通过TCP协议

服务器端:

package ObjectTCP;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ObjectServer {
	/**
	 * 这个服务器端的和连接端 ,要按照一个特定的格式去发送和接受数据,这个的这个格式就student类 
	 * 我们要知道 ObjectInputStream 对象,能够发送的对象必须实现了序列化的接口才能够使用
	 * Serializable
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		ServerSocket serverSocket=new ServerSocket(8005);
		Socket socket=serverSocket.accept();
		OutputStream out=socket.getOutputStream();
		ObjectOutputStream oos=new ObjectOutputStream(out);
		Student student=new Student(1,"tianzhw",26,"10000");
		oos.writeObject(student);
		oos.close();
		socket.close();
		serverSocket.close();	
	}
}

链接端:

package ObjectTCP;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ObjectSocketClient {
	/**
	 * 这是一个socket客户端,因为我们和服务器端都遵守一个特定的方式来接受和传递数据,所以我们知道
	 * 我们所接受的数据类型,是一个student类型的数据。
	 */
	public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
		Socket socket = new Socket("192.168.18.4", 8005);
		ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
		Student s = (Student) ois.readObject();
		System.out.println(s.getAge()+":" + s.getId() +":"+ s.getName()+":" + s.getSorc());		
		ois.close();
		socket.close();
	}
}

javaBean类的代码

package ObjectTCP;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Student implements Serializable {
	private String name;
	private int age;
	private String sorc;
	private int id;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Student() {
		// TODO Auto-generated constructor stub
	}
	public Student(int id, String name, int age, String sorc) {
		// TODO Auto-generated constructor stub
		this.setId(id);
		this.setName(name);
		this.setSorc(sorc);
		this.setAge(age);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSorc() {
		return sorc;
	}
	public void setSorc(String sorc) {
		this.sorc = sorc;
	}
}