您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第19章:Java网络编程】_TCP程序设计
发布时间:2021-01-20 15:21:35编辑:雪饮阅读()
用ServerSocket类可以创建socket服务端提供给socket客户端的访问资源
import java.net.* ;
import java.io.* ;
public class Hello{
public static void main(String args[]) throws Exception{
ServerSocket server = new ServerSocket(8888) ;
Socket client =server.accept() ; // 得到连接,程序进入到阻塞状态
PrintStream out = new PrintStream(client.getOutputStream()) ;
System.out.println("服务器运行,等待客户端连接。") ;
out.println("hello world") ; // 客户端连接成功后向客户端输出信息
client.close() ;
server.close() ;
}
};
以telnet为例,先编译并运行该服务端程序,然后运行telnet localhost 8888于cmd中就可以连接,如果没有安装telnet需要先在控制面版中开启该功能(自带无需另外下载,只需要开启下),由于是本机执行的服务端,没有指定监听地址,则监听地址默认是localhost
用Socket类可以实例化socket客户端以代替telnet完成客户端连接
import java.net.* ;
import java.io.* ;
public class HelloClient{
public static void main(String args[]) throws Exception { // 所有异常抛出
Socket client =new Socket("localhost",8888) ;
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
String str = buf.readLine() ;
System.out.println("服务器端输出内容:" + str) ;
buf.close() ;
client.close() ;
}
};
D:\>javac HelloClient.java
D:\>java HelloClient
服务器端输出内容:hello world
定义一个不间断接收用户连接的socket资源
上面定义的服务端资源实现,用户端仅连接一次后服务端就中断了。用while死循环方式实现不间断服务,对于某个指定连接若该连接在服务端接收到空内容或者null或者bye时候对于该连接则退出监听(对每个连接的监听其实也是笨笨的一个死循环)
import java.net.* ;
import java.io.* ;
public class Hello{
public static void main(String args[]) throws Exception { // 所有异常抛出
ServerSocket server = new ServerSocket(8888) ; // 服务器在8888端口上监听
boolean flag1 = true ;
//这里需要注意,直接用true做条件会编译不通过,什么奇怪的语法,常理无法理解之
while(flag1){
System.out.println("服务器运行,等待客户端连接。") ;
Socket client = server.accept() ; // 得到连接,程序进入到阻塞状态
PrintStream out = new PrintStream(client.getOutputStream()) ;
// 准备接收客户端的输入信息
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
boolean flag = true ; // 标志位,表示可以一直接收并回应信息
while(flag){
String str = buf.readLine() ; // 接收客户端发送的内容
if(str==null||"".equals(str)){ // 表示没有内容
flag = false ; // 退出循环
}else{
if("bye".equals(str)){ // 如果输入的内容为bye表示结束
flag = false ;
}else{
out.println("ECHO : " + str) ; // 回应信息
}
}
}
client.close() ;
}
server.close() ;
}
};
D:\>javac Hello.java
D:\>java Hello
服务器运行,等待客户端连接。
然后用telnet连接localhost 8888就可以不间断的输入信息了。
服务端要不间断的监听接收,客户端同样要实现处理
import java.net.* ;
import java.io.* ;
public class EchoClient{
public static void main(String args[]) throws Exception { // 所有异常抛出
Socket client =new Socket("localhost",8888) ;
BufferedReader buf =new BufferedReader(new InputStreamReader(client.getInputStream())) ;
PrintStream out = new PrintStream(client.getOutputStream()) ; // 发送数据
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)) ; // 接收键盘数据
boolean flag = true ; // 定义标志位
while(flag){
System.out.print("输入信息:") ;
String str = input.readLine() ; // 接收键盘的输入信息
out.println(str) ;
if("bye".equals(str)){
flag = false ;
}else{
String echo = buf.readLine() ; // 接收返回结果
System.out.println(echo) ; // 输出回应信息
}
}
buf.close() ;
client.close() ;
}
};
D:\>javac EchoClient.java
D:\>java EchoClient
输入信息:asdas
ECHO : asdas
输入信息:asdsa
ECHO : asdsa
输入信息:dasd
ECHO : dasd
输入信息:
异步的服务端
测试发现无论是telnet或者上面实现的客户端,若开两个客户端,第一个不关闭的情况下,第二个是无法连接的(理论),就算第一个关闭由于没有处理关闭异常,所以服务端也是会崩溃的。异步的服务端就是多线程,可以解决同时多个客户端的连接。
import java.net.* ;
import java.io.* ;
class EchoThread implements Runnable{
private Socket client = null ;
public EchoThread(Socket client){
this.client = client ;
}
public void run(){
try{
PrintStream out = new PrintStream(client.getOutputStream()) ;
// 准备接收客户端的输入信息
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
boolean flag = true ; // 标志位,表示可以一直接收并回应信息
while(flag){
String str = buf.readLine() ; // 接收客户端发送的内容
if(str==null||"".equals(str)){ // 表示没有内容
flag = false ; // 退出循环
}else{
if("bye".equals(str)){ // 如果输入的内容为bye表示结束
flag = false ;
}else{
out.println("ECHO : " + str) ; // 回应信息
}
}
}
client.close() ;
}catch(Exception e){}
}
};
public class Hello{
public static void main(String args[]) throws Exception { // 所有异常抛出
ServerSocket server = new ServerSocket(8888) ; // 服务器在8888端口上监听
boolean f = true ; // 定义个标记位
while(f){
System.out.println("服务器运行,等待客户端连接。") ;
Socket client = server.accept() ; // 得到连接,程序进入到阻塞状态
new Thread(new EchoThread(client)).start() ; // 每一个客户端表示一个线程
}
server.close() ;
}
};
D:\>javac Hello.java
D:\>java Hello
服务器运行,等待客户端连接。
服务器运行,等待客户端连接。
服务器运行,等待客户端连接。
关键字词:java,socket