基于TCP协议的通信

socket套接字:绑定一个端口,用于该端口的通信服务

socket.getInputStream()       用套接字可以获取输入输出流,通过输入输出流可以进行数据的传输

socket.shutdowmOutput()   用套接字可以关闭半读或半写状态

socket.IsInputstream()         返回一个布尔值,如果为true,就说明该线程已关闭半读状态

socket.getInetAddress()       可以返回一个InetAddress:也就是IP地址

serversocket :主机端生成的主机套接字

通过该套接字的accept()方法,可以一直监听该端口的请求信息,假如有客户请求就生成一个对应的socket套接字与客户进行交流

所以我们可以创建一个线程类,只要给入对应的套接字对象就可以让该线程绑定一个客户,多个客户就生成多个线程

可以实现主机一对多访问


代码实例:

 主机服务器类public class SocketLoginServer {
public static void main(String[] args) {
Socket socket = null;
ServerSocket serverSocket = null;
try {
//主机套接字负责5000端口的信息访问
serverSocket = new ServerSocket(5000);

//主机的循环是无限的,只要有客户登录就必须启动一个对应线程进行服务
do {
//开始监听,只要有用户请求,就创建相应的套接字
socket = serverSocket.accept();

//用对应的套接字创建一个对应的线程进行服务
MyLoginServer server  =new MyLoginServer(socket);
server.start();


} while (true);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}

客户端

public class SocketDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
OutputStream os= null;
InputStream is =null;
String str = null;
Socket socket = null;
try {
//将创建接口与主建立一次链接作为一次循环过程,根据需要确定是否继续访问主机
do {
//顾客向远程端进行访问,输入要访问服务器的地址信息
socket = new Socket("localhost",5000);

//用这个端口获取输出流
os = socket.getOutputStream();
System.out.print("顾客输出:");
str = scanner.next();

//假如是进行序列化传输的的话就用ObjectOutputStream来输出,用os做参数
//序列化
// ObjectOutputStream ois=new ObjectOutputStream(os);

//将控制台录入的文本进行流传输
os.write(str.getBytes());
//同时结束这次的端口写的功能
socket.shutdownOutput();

//同时用端口获取一个读的数据流
is = socket.getInputStream();
//获取一个带缓冲池字符类型的输入流,因为它包含了一个将字节数组转换为字符数组的中转站inputstreamread
BufferedReader br = new BufferedReader(new InputStreamReader(is));


//接收主机返回的信息
String s = null;
while((s = br.readLine())!=null){
System.out.println("主机说:"+s);
}
//每次执行完毕都关闭接口,假如不满足结束条件还需继续向主机发送请求,就会回到上面继续创建一个新的socket套接字
socket.close();

} while (!str.equals("退出链接"));


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (os!=null) {
try {
os.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

主机服务器启动来对应客户访问线程

public class MyLoginServer extends Thread{
private Socket socket;
public MyLoginServer(Socket socket){
this.socket = socket;
}


public void run() {
Scanner input = new Scanner(System.in);
OutputStream os =null;
InputStream is = null;
OutputStream o =null;
String s = null;
String str = null;

try {
//通过套接字获取该端口的输入流读取输入进来的信息
is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//获取用户的地址
InetAddress ia = socket.getInetAddress();

//输出打印客户的请求
while((str = br.readLine())!=null){
System.out.println(ia+":"+str);
}
//回复信息
//通过套接字获取新的输出流
os = socket.getOutputStream();
System.out.print("主机输出:");
s = input.next();
os.write(s.getBytes());
//关闭半写状态
socket.shutdownOutput();


} catch (IOException e) {
e.printStackTrace();
}finally{
if (os!=null) {
try {
//使用完毕,关闭套接字
socket.close();
os.close();
is.close();

} catch (IOException e) {
e.printStackTrace();
}

猜你喜欢

转载自blog.csdn.net/jinqianwang/article/details/80290339