客户端socket
流程:
1、连接远程主机
2、发送数据
3、接收数据
4、关闭流与socket连接
实例:
import java.io.*;
import java.net.Socket;
import java.util.Date;
/**
* Created by CLY on 2017/7/11.
*/
public class ClientSocket {
public static void main(String[] arg){
int port = 233;//与之连接的服务端套接字的端口号
String host = "127.0.0.1";//与之连接的服务端套接字ip地址
Socket socket = null;
try {
//创建socket连接,即在该Socket构造函数返回之前,就会与远程主机建立连接,如果未能连接,则会抛出异常。
socket = new Socket(host, port);
//获取输出流,向服务器端发送当前时间
OutputStream outputStream = socket.getOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
String now_date = new Date().toString();
writer.write("客户端当前时间为——"+now_date);
writer.flush();
////关闭客户端的输出流。相当于给流中加入一个结束标记-1.这个样子服务器的输入流的reaLine方法就会读到一个-1,然后结束readLIne方法。
socket.shutdownOutput();
//获取输入流,并读取服务器端的响应信息
InputStream inputStream= socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String server_info = null;
while((server_info=br.readLine())!=null){
System.out.println("服务端传过来的值:"+server_info);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//如果socket不为null,则释放掉它
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端Socket
流程:
1、绑定端口
2、监听入站数据
3、在绑定的端口上接受来自远程机器的连接
4、接收数据
5、发送数据
6、关闭流与socket连接
实例:
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by CLY on 2017/7/11.
*/
public class MyServerSocket {
public static void main(String[] arg){
/**
* 根据tcp协议可知,所谓套接字(socket)是指一个由“ip地址+端口”组成的组合。
* 而每一台主机的ip地址都是确定的,不需要我们来指定,
* 所以构建服务器socket的第一步就是确定端口
*/
try {
int port = 233;//端口号
int queueLength = 50;//最大入站连接
InetAddress bindAddress = InetAddress.getByName("127.0.0.1");//只监听该ip的指定端口
ExecutorService pool = Executors.newFixedThreadPool(50);//创建一个最大容量为50的线程池,为每一个入站连接分配一条线程。
//创建一个端口为“233”的服务器socket
ServerSocket serverSocket = new ServerSocket(port);
//创建一个端口为233的服务器socket,且队列一次最多能保存50个入站连接
//ServerSocket serverSocket = new ServerSocket(port,queueLength);
//假设一台主机有多个ip地址,则服务器socket会默认在所有ip地址的指定端口上监听,但可以指定其只监听指定ip的端口。
//ServerSocket serverSocket = new ServerSocket(port,queueLength,bindAddress);
while (true){
//accept()调用会阻塞,会一直等到有客户端连接到指定socket端口为止。
final Socket connection = serverSocket.accept();
//线程池中拿取一条线程来处理socket连接。然后主程序运行下一个循环,继续等待下一个客户端的访问。
pool.execute(new Runnable() {
public void run() {
try {
//从输入流中读取获取客户端传过来的值
InputStream inputStream= connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String client_info = null;
while((client_info=br.readLine())!=null){
System.out.println("客户端传过来的值:"+client_info);
}
//测试:将当前时间写入流中返回给客户端
Writer writer = new OutputStreamWriter(connection.getOutputStream());
String nowData = new Date().toString();
writer.write("服务端当前时间为——"+nowData);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭socket连接
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}