Socket 点对点 通信

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



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值