Java Client/Server 基础知识

Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP
(WWW),与此相对应的Java网络类库的子类库为: 

   Java.net 
   Java.net.ftp 
   Java.net.www.content 
   Java.net.www.html 
   Java.net.www.http 

  这些子类库各自容纳了可用于处理Internet协议的类和方法。其中,java.net用于处理一些基本的网络功能,包括远程登录(Telnet);java.net.ftp用于处理ftp协议;java.net.www.content用于处理WWW
页面内容;java.net.www.html 和java.net.www.http 则分别提供了对HTML 语言和HTTP 协议的支持。

客户机/服务器环境下的Java应用程序 

  客户机/服务器在分布处理过程中,使用基于连接的网络通信模式。该通信模式首先在客户机和服务器之间定义一套通信协议,并创建一Socket类,利用这个类建立一条可靠的链接;然后,客户机/服务器再在这条链接上可靠地传输数据。客户机发出请求,服务器监听来自客户机的请求,并为客户机提供响应服务。这就是典型的"请求--
应答"
模式。下面是客户机/服务器的一个典型运作过程: 

  1、服务器监听相应端口的输入; 

  2、客户机发出一个请求; 

  3、服务器接收到此请求; 

  4、服务器处理这个请求,并把结果返回给客户机; 

  5、重复上述过程,直至完成一次会话过程。

按照以上过程,我们使用Java语言编写一个分别针对服务器和客户机的应用程序(Application)。该程序在服务器上时,程序负责监听客户机请求,为每个客户机请求建立Socket
连接,从而为客户机提供服务。本程序提供的服务为:读取来自客户机的一行文本,反转该文本,并把它发回给客户机。 
客户端实例:

public class ClientTest {
  public void starClient(){
  Socket
client=null;
  try {
    client = new
Socket("192.168.1.122",8080);
    System.out.println("客户端成功启动");
    while(true){
      //发送数据到服务器

      Scanner sc = new
Scanner(System.in);
      System.out.println("请输入要发送给服务器的数据:");
      String
str = sc.next();
      PrintStream ps= new
PrintStream(client.getOutputStream());
      ps.println(str);

       //接受服务器发回来的消息

        InputStream is = client.getInputStream();
        BufferedReader br =
new BufferedReader(new InputStreamReader(is));
        String line =
br.readLine();
        System.out.println("服务器说 :"+line);
     }


  } catch (UnknownHostException e) {
  // TODO Auto-generated
catch block
  e.printStackTrace();
  } catch (IOException e) {
  //
TODO Auto-generated catch
block
  e.printStackTrace();
  }finally{
  if(client!=null){
  try
{
  client.close();
  } catch (IOException e) {
  // TODO
Auto-generated catch
block
  e.printStackTrace();
   }
  }
}
}
public static
void main(String[] args) {
  ClientTest test = new
ClientTest();
  test.starClient();
}
}

服务器实例:

public class ServerTest {
public void
starServer(){
//创建服务器
ServerSocket server=null;
try
{

server = new
ServerSocket(5000);
System.out.println("服务器启动成功");
} catch
(IOException e1) {
// TODO Auto-generated catch
block
e1.printStackTrace();
System.out.println("服务器启动失败");
}

Socket
client = null;
try {

//等待客户端连接
client =
server.accept();
while(true){
//获取客户端的数据
InputStream is =
client.getInputStream();
BufferedReader br = new BufferedReader(new
InputStreamReader(is));
String line =
br.readLine();
System.out.println("客户端说:"+line);

//服务器放送数据给客户端
PrintStream
ps = new PrintStream(client.getOutputStream());
Scanner sc = new
Scanner(System.in);
System.out.println("请输入发送给客户端的信息");
String str =
sc.next();
ps.println(str);
}

} catch (IOException e)
{
// TODO Auto-generated catch
block
e.printStackTrace();
}
}

public static void main(String[] args) {
ServerTest test = new
ServerTest();
test.starServer();
}

}

  通过该程序实例我们看到,使用Java语言设计C/S程序时需要注意以下几点: 

  (1)、
服务器应使用ServerSocket 类来处理客户机的连接请求。当客户机连接到服务器所监听的端口时,ServerSocket将分配一新的Socket
对象。这个新的Socket
对象将连接到一些新端口,负责处理与之相对应客户机的通信。然后,服务器继续监听ServerSocket,处理新的客户机连接。 

  Socket
和ServerSocket
是Java网络类库提供的两个类。 

  (2)、服务器使用了多线程机制。Server对象本身就是一个线程,它的run()方法是一个无限循环,用以监听来自客户机的连接。每当有一个新的客户机连接时,ServerSocket就会创建一个新的Socket类实例,同时服务器也将创建一新线程,即一个Connection
对象,以处理基于Socket 的通信。与客户机的所有通信均由这个Connection 对象处理。Connection的构造函数将初始化基于Socket
对象的通信流,并启动线程的运行。与客户机
的通信以及服务的提供,均由Connection对象处理。 

  (3)、客户机首先创建一Socket对象,用以与服务器通信。之后需创建两个对象:DataInputStream
和PrintStream,前者用以从Socket 的InputStream 输入流中读取数据,后者则用于往Socket的OutputStream
中写数据。最后,客户机程序从标准输入(如:控制台)中读取数据,并把这些数据写到服务器,在从服务器读取应答消息,然后把这些应答消息写到准输出。

时间: 2024-08-09 12:34:51

Java Client/Server 基础知识的相关文章

SQL Server基础知识

查看sql server版本 select @@VERSION 基本操作 use tty; 使用tty数据库 create table tt(name varchar(10)); 新建表tt insert into tt values('ftp'); 插入数据ftp select * from tt; 查看表tt delete from tt; 删除表表tt中的一条记录 运行命令的快捷方式: Alt+x 重启数据库服务 net restart mssqlserver 修改用户密码 企业管理器——

Java语言的基础知识

第三章 1.在java源文件编辑器中,选择某个成员变量,然后按住shift+alt+j,Eclipse会自动添加JavaDoc文档注释结构,如果选择的是方法,还会自动添加参数名称. 2.Java语言规定标示符是由任意的字母.下划线.美元符号和数字组成,并且第一个字符不能使数字,标示符不能使java中的保留关键字. 3.在Java语言中允许使用汉字或其他语言文字作为变量名,如int 年龄 =21;在程序运行时不会报错,但建议尽量不要使用这些语言作为变量. 4.java用关键字final来声明常量,

Java并发(基础知识)—— Executor框架及线程池

在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有问题的,但是当需要创建大量线程时就会出现问题,因为这种使用方法把线程创建语句随意地散落在代码中,无法统一管理线程,我们将无法管理创建线程的数量,而过量的线程创建将直接使系统崩溃. 从高内聚角度讲,我们应该创建一个统一的创建以及运行接口,为我们管理这些线程,这个统一的创建与运行接口就是JDK 5的Ex

Java语言的基础知识4

第五章(数组) 1.在Java中可以将数组看做是一个对象虽然基本数据类型不是对象但有基本数据类型组成的数组是对象. 2.对于二维数组求第二维就用array[0].length, array.length就是默认的是第一维的长度. 3.foreach并不是一个新的语法它是for的循环的格式化主要执行遍历功能的循环,example: int arry ={1,2,3,4,5}; for(int i :array){ system.out.println(): } 4.数组元素定义完以后可通过Arra

黑马程序员——Java I/O基础知识之I/O流

I/O流基础知识--字节流和字符流 文件存储在硬盘中,是以二进制表示的,只有内存中才能形成字符.数据的来源可以有硬盘,内存,控制台,网络,Java把数据从一个地方转到另一个地方的现象称为流,用InputStream和OutputStream接口来表示,这两个流里面的都是以字节为单位的,后来加入了Reader和Writer,里面操作的是字符,是两个字节为单位的. 字节流 字节流将数据写入文件 try { File file =new File("d:" +File .separator+

Java语言的基础知识12

第十四章(使用集合类保存对象) 1.java中得集合对象就像是一个容器,它用来存放Java类的对象.Java中的集合类有些方便存入和取出,有些则方便查找.集合类和数组的区别是,数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型,集合用来存放对象的引用.常用的集合类有List集合,Set集合,和Map集合. 2.List集合包括List接口以及List接口的所有实现类.List集合中的元素许重复,个元素的顺序就是对象插入的顺序.类似java中的数组.List类继承了Collection接

SQL server基础知识(表操作、数据约束、多表链接查询)

SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database 数据库名称 查询:select name from master..sysdatabases 修改:alter database 数据库名称(在 sql server 中修改与数据库关联的文件和文件组.在数据库中添加或删除文件和文件组.更改数据库或其文件和文件组的属性) (3).管理表 选择数据库:use 数

Java语言的基础知识10

第十二章(GUI事件) 1.GUI事件的处理机制是建立交互式应用程序的关键技术,其中事件是用在程序界面上的各种操作. 2.写程序的时候对于swing的一些空间譬如jprogressbar ,jtextfield等空间在全局中声明以后,用的时候一定要new 一下,自己经常忘记(由于对java理解不深) private  JTextField textField2; textField2 = new JTextField(); 3.事件在java语言中也是一种对象 4.监听器接受到事件之后,将委托指

Java语言的基础知识9

第十一章(线程) 1.通过String name=Thread.currentThread().getName();来获取当前线程的名称. 2.多次启动一个线程或者启动一个已经运行的线程是非法的,会抛出IllegalThreadStateException异常对象. Thread.sleep((int)Math.random()*10000); 3.java提供了Runnable接口使继承了其他类之后同样可以实现该接口达到创建线程的目的Runabble接口同样定义了Run方法. 实现Runnab