Socket通常称作为 "套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通过Socket向网络发出请求或者应答网络请求.Socket是简历在网络连接时使用,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.
对于同一个网络连接来说,Socket是平等的,并没有差别,不因为在服务器端或在客户端,而产生不同的级别.
Socket服务器端需要在某个端口上开启服务器端类型类,java.net.ServerSocket.通过Accept()方法用户产生"阻塞",知道接收到一个连接,并且返回一个客户端的Socket对象实例."阻塞"是使程序运行暂时"停留" 在这个地方,直到一个会话产生,然后程序继续,通常 "阻塞"是有循环产生的
Socket客户端根据服务器端的IP地址和端口号 创建一个Socket对象.连接服务器.服务器端和客户端都持有有个Socket对象,服务器端的Socket从服务器端指向客户端,而客户端的Socket从客户端指向服务器端,就像在服务器和客户端建立了两条单向的管道
//ServerSocket
package com.itheima.net.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class SocketServer{ //Socket服务器端
private int prot; //端口
public SocketServer(int prot) {
this.prot = prot;
//这里开始启动监听
start();
}
//处理信息
public String infoUpperCase(String line){
return line.toUpperCase(); //将字符串大写
}
//启动服务器
public void start(){
try {
//根据端口创建服务器端Socket对象
ServerSocket serverSocket=new ServerSocket(prot);
System.out.println("服务器端口已启动,监听端口号为:"+prot);
System.out.println("正在等客户端的连接......");
//挂起 等待客户的请求
Socket socketAccept= serverSocket.accept();
//读取客户端的数据流
BufferedReader in=new BufferedReader(new InputStreamReader(socketAccept.getInputStream()));
//获取写往客户端的输出流,true表示自动刷新
PrintWriter out=new PrintWriter(socketAccept.getOutputStream(),true);
out.println("服务器端连接成功....");
out.println("输入exit断开和服务器的连接");
boolean done=false;
while(!done){
String line=in.readLine(); //读取客户端的每一行文本
if(line==null){
done=true;
}else{
//显示客户端发送的内容
System.out.println("客户端传来的内容:"+line);
String message=infoUpperCase(line); //转换信息
out.println("从服务器端口发送的内容:"+message);
if(line.trim().equals("exit")) //退出判断
done=true;
}
}
socketAccept.close();
} catch (Exception e) {
System.out.println("启动服务器端出项错误:"+e.getMessage());
}
}
}
public class TextSocketServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
SocketServer server=new SocketServer(8080); //传入端口实例化对象
} catch (Exception e) {
System.out.println("测试服务器端监听出错:"+e.getMessage());
}
}
}
//SocketClient
package com.itheima.net.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
class Client{
private String host; //IP地址或域名
private int prot; //端口号
public Client(String host, int prot) {
this.host = host;
this.prot = prot;
//这里开始连接
connectionSocket();
}
//连接的方法
public void connectionSocket(){
try {
Socket socketConn;
if(host.equals("localhost") || host.equals("127.0.0.1")){
socketConn=new Socket(InetAddress.getLocalHost(),prot);
}else{
socketConn=new Socket(InetAddress.getByName(host),prot);
}
//获得从键盘的输入流
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
//获得服务器内容的数据流
PrintWriter out=new PrintWriter(socketConn.getOutputStream(),true);
//获得服务器端发送内容的缓冲流
BufferedReader in=new BufferedReader(new InputStreamReader(socketConn.getInputStream()));
System.out.println("服务器信息:"+in.readLine()); //从服务器端获取信息
System.out.println("服务器信息:"+in.readLine());
System.out.print("请输入>");
boolean done=false;
while(!done){
String line=stdin.readLine(); //获得从键盘输入的每行字符
out.println(line); //发送到服务器端
if(line.equalsIgnoreCase("exit"))
done=true;
String info=in.readLine();
System.out.println("服务器信息:"+info);
if(!done)
System.out.println("请输入>");
}
socketConn.close();
} catch (SecurityException e) {
System.out.println("连接服务器出现安全问题:"+e.getMessage());
}catch (Exception e) {
System.out.println("连接服务器出现I/O错误:"+e.getMessage());
}
}
}
public class TextSocketClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
new Client("localhost", 8080);
} catch (Exception e) {
System.out.println("测试客户端连接出错:"+e.getMessage());
}
}
}