JAVA笔记:Java网络编程(三)TCP程序设计

在Java中使用Socket完成TCP程序的开发,使用此类可以建立点对点的通讯连接。

在Socket的程序开发中,服务器端使用ServerSocket等待客户端的连接,对于Java的网络程序来讲,每一个客户端都使用一个Socket对象表示。

客户端只要符合连接的通讯协议,服务器端都可以接收。

SeverSocket类

SeverSocket类的主要方法:

Socket类

在服务器端每次运行时都需要使用accept()方法等待客户端连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才向下执行,此方法的返回类型是Socket,每一个Socket都表示一个客户端对象。

Socket类的主要方法:

在通讯时,服务器端可以进行输入和输出,同时客户端也可以进行输入和输出。

一个简单的C/S架构设计:

服务器端指定端口向客户端发送数据,客户端通过该端口接收数据。

服务器端:

package IP_demo;import java.awt.print.Printable;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;public class HelloServer {public static void main(String[] args) throws IOException {ServerSocket server = null;Socket client = null;PrintStream out = null;server = new ServerSocket(8080);System.out.println("服务器运行,等待客户端连接···");client = server.accept();String str = "Helloworld";out = new PrintStream(client.getOutputStream());out.println(str);client.close();server.close();}}

客户端:

package IP_demo;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.Socket;public class HelloClient {public static void main(String args[]) throws Exception {// 所有异常抛出Socket client = null;client = new Socket("localhost", 8080);BufferedReader buf = null;buf = new BufferedReader(new InputStreamReader(client.getInputStream()));String str = buf.readLine();System.out.println("服务器端输出内容:" + str);buf.close();client.close();}};

C/S架构需要同时维护服务器端/客户端两套代码。

上述代码只能完成一次数据传递,下面的实例是网络编程通讯交互的一个经典案例,称为回应程序,,客户端输入什么,服务器端就会回应收到的内容。

服务器端的设计:为了使客户端可以有多个用户同时使用,所以要加上多线程的操作:

import java.net.* ;import java.io.* ;public class EchoThreadServer{public static void main(String args[]) throws Exception {// 所有异常抛出ServerSocket server = null ;// 定义ServerSocket类Socket client = null ;// 表示客 户端server = new ServerSocket(8888) ;// 服务器在8888端口上监听boolean f = true ;// 定义个标记位while(f){System.out.println("服务器运行,等待客户端连接。") ;client = server.accept() ;// 得到连接,程序进入到阻塞状态new Thread(new EchoThread(client)).start() ;// 每一个客户端表示一个线程}server.close() ;}};import java.net.* ;import java.io.* ;public class EchoThread implements Runnable{private Socket client = null ;public EchoThread(Socket client){this.client = client ;}public void run(){BufferedReader buf = null ;// 接收输入流PrintStream out = null ;// 打印流输出最方便try{out = new PrintStream(client.getOutputStream()) ;// 准备接收客户端的输入信息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){}}};客户端:

import java.net.* ;import java.io.* ;public class EchoClient{public static void main(String args[]) throws Exception {// 所有异常抛出Socket client = null ;// 表示客 户端client = new Socket("localhost",8888) ;BufferedReader buf = null ;// 一次性接收完成PrintStream out = null ;// 发送数据BufferedReader input = null ;// 接收键盘数据input = new BufferedReader(new InputStreamReader(System.in)) ;buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;out = new PrintStream(client.getOutputStream()) ;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() ;}};

就是对虚怀若谷谦虚谨慎八个字真正理解的人,

JAVA笔记:Java网络编程(三)TCP程序设计

相关文章:

你感兴趣的文章:

标签云: