您的位置:首页 > 理论基础 > 计算机网络

通过Socket实现TCP编程

2016-08-02 15:29 417 查看
基于Tcp的Socket通信原理

Java socket通信通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket 开发分客户端与服务端,服务端ServerSocket开启服务监听某一端口,客户端socket向此服务器的这个端口发出请求,成功则会建立会话,形成通道,这个通道若不做其它操作会一直存在,就是所谓的长连接了,这时服务端与客户端可以通过此通道进行即时通信.

通信模型:



服务器端的实现:

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/*
*
* 服务器端
* 基于TCP协议的Socket通信
*
* */
public class Server {

public static void main(String[] args) throws IOException {
// 1.创建ServerSocket对象,绑定监听端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8880);
// 2.通过accept方法监听客户端请求,等待客户端的连接
Socket socket = socket = serverSocket.accept();
//3.连接建立后,通过输入流读取客户端发送的请求信息
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("服务器端收到的客户端传来的请求内容为:"+info);
}
//4.通过输出流向客户端发出响应信息
OutputStream os = socket.getOutputStream();
PrintWriter print = new PrintWriter(os);
print.write("欢迎您!");
print.flush();
socket.shutdownOutput();
// 5.关闭相关资源
serverSocket.close();
}

}


客户端的实现

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/*
*
* 客户端
* 基于TCP协议的Socket通信
*
* */
class Client {

public static void main(String[] args) throws UnknownHostException,
IOException {
// 1.创建Socket对象,指明要连接的服务器地址和端口号
Socket socket = new Socket("localhost", 8888);
// 2.连接建立后,通过输出流向服务器端发送请求
OutputStream os = socket.getOutputStream();// 字节输出流
PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
print.write("用户名:admin; 密码:123");
print.flush();
socket.shutdownOutput();
// 3.通过输入流读取服务器端响应的信息
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("客户端收到的服务器端传来的响应内容为:" + info);
}
// 4.关闭相关资源
socket.close();
}

}


应用多线程来实现服务器与多线程之间的通信

步骤如下:

1、服务器端创建ServerSocket,循环调用accept()等待客户端链接

2、客户端创建一个Socket并请求和服务器端链接

3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接

4、建立链接的socket在一个单独的线程上对话

5、服务器继续等待新的链接

服务器端多线程的实现

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread {
Socket socket  = null;
ServerThread(Socket socket ) {
this.socket  = socket;
}
public void run(){
//3.连接建立后,通过输入流读取客户端发送的请求信息
try {
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("服务器端收到的客户端传来的请求内容为:"+info);
}
//4.通过输出流向客户端发出响应信息
OutputStream os = socket.getOutputStream();
PrintWriter print = new PrintWriter(os);
print.write("欢迎您!");
print.flush();
socket.shutdownOutput();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


服务器端的实现

package Socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
*
* 服务器端
* 基于TCP协议的Socket通信
*
* */
public class Server {

public static void main(String[] args) throws IOException {
// 1.创建ServerSocket对象,绑定监听端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8880);
// 2.通过accept方法监听客户端请求,等待客户端的连接
Socket socket = null;
int count = 0;
while (true) {
socket = serverSocket.accept();
Thread thread = new ServerThread(socket);
thread.start();
count++;
System.out.println("客户端的数量为:"+count);
}
// 5.关闭相关资源
//serverSocket.close();
}

}


客户端的实现

与上述无异

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/*
*
* 客户端
* 基于TCP协议的Socket通信
*
* */
class Client {

public static void main(String[] args) throws UnknownHostException,
IOException {
// 1.创建Socket对象,指明要连接的服务器地址和端口号
Socket socket = new Socket("localhost", 8888);
// 2.连接建立后,通过输出流向服务器端发送请求
OutputStream os = socket.getOutputStream();// 字节输出流
PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
print.write("用户名:admin; 密码:123");
print.flush();
socket.shutdownOutput();
// 3.通过输入流读取服务器端响应的信息
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("客户端收到的服务器端传来的响应内容为:" + info);
}
// 4.关闭相关资源
socket.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: