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;
}
}