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 中写数据。最后,客户机程序从标准输入(如:控制台)中读取数据,并把这些数据写到服务器,在从服务器读取应答消息,然后把这些应答消息写到准输出。

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

  1. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

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

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  3. Sql Server 基础知识

    Sql Server 基础知识: http://blog.csdn.net/t6786780/article/details/4525652 Sql Server 语句大全: http://www.c ...

  4. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  5. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  6. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  7. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

  8. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  9. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

随机推荐

  1. GridView中使用 jQuery DatePicker (UpdatePanel)

    1.无UpdatePanel   1.代码 <script> $(function () { $('.myDatePickerClass').datepicker({ dateFormat ...

  2. Delphi基础-数据类型

    枚举类型 Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据.例如,性别.月份.星期几.颜色.单位名.学历.职业等. ​ 1. 枚举类型的定义 格式: type 枚举类型标识符=(标识符 ...

  3. Dockerfile 中的 multi-stage

    在应用了容器技术的软件开发过程中,控制容器镜像的大小可是一件费时费力的事情.如果我们构建的镜像既是编译软件的环境,又是软件最终的运行环境,这是很难控制镜像大小的.所以常见的配置模式为:分别为软件的编译 ...

  4. Ubuntu出现ERR_PROXY_CONNECTION_FAILED错误解决方案

    我是Ubuntu新手,因为想查看国外的资料,然后安装了灯笼,结果打开谷歌浏览器出现了ERR_PROXY_CONNECTION_FAILED错误,未连接到互联网,代理服务器出现错误,然后Firefox也 ...

  5. HNOI2017 单旋

    题目描述 网址:https://www.luogu.org/problemnew/show/3721 大意: 有一颗单旋Splay(Spaly),以key值为优先度,总共有5个操作. [1] 插入一个 ...

  6. Couldn't save uncommitted changes.

    关于idea切换分支报错的问题. Couldn't save uncommitted changes. Tried to save uncommitted changes in stash befor ...

  7. 使用 SVN 创建 Externals 引用 其他 SVN项目

    方法地址 http://blog.sina.com.cn/s/blog_6204ca300101itg2.html

  8. 两种插入排序算法java实现

    两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { Inser ...

  9. Django用户登录与注册系统

    一.创建项目 1.1.创建项目和app python manage.py startproject mysite_login python manage.py startapp login 1.2.设 ...

  10. 如何实现类似Oracle中的家族树功能

    先来设计一下表结构: create table city(id varchar(3) , pid varchar(3) , name varchar(10)); 下面我们造几条测试数据: INSERT ...