`
qinweiping
  • 浏览: 131642 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

Java学习小记(十二)Socket编程

阅读更多

网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。

  Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client
=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

  上面的方法基本可以建立一条连线让两台计算机相互交流了,可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的,除非远程调用,处理问题的核心在执行上,否则数据的交互还是依赖于IO操作的,所以你也必须导入java.io这个包.java的IO操作也不复杂,它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。

BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());

  上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作,而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出,那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了.

  服务方:

import java.io.*;
import java.net.*;
public class MyServer {
 public static void main(String[] args) throws IOException{
  ServerSocket server=new ServerSocket(5678);
  Socket client=server.accept();
  BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
  PrintWriter out=new PrintWriter(client.getOutputStream());
  while(true){
   String str=in.readLine();
   System.out.println(str);
   out.println("has receive....");
   out.flush();
   if(str.equals("end"))
    break;
  }
  client.close();
 }
}

  这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送"End"字符串就退出程序,并且服务器也会做出"Receive"为回应,告知客户机已接收到消息。

  客户机代码:

import java.net.*;
import java.io.*;

public class Client{
 static Socket server;

 public static void main(String[] args)throws Exception{
  server=new Socket(InetAddress.getLocalHost(),5678);
  BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
  PrintWriter out=new PrintWriter(server.getOutputStream());
  BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));

  while(true){
   String str=wt.readLine();
   out.println(str);
   out.flush();
   if(str.equals("end")){
    break;
   }
   System.out.println(in.readLine());
  }
  server.close();
 }
}

  客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。

  这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可知道呵呵会消息告诉我哈

1
0
分享到:
评论

相关推荐

    java小记.rar

    Java Web开发是软件行业中一个广泛讨论的话题,涵盖了诸如Servlet、JSP、JDBC、MVC框架、企业级组件以及各种工具和技术。...通过学习和参考这些笔记,可以提升Java Web开发技能,更好地应对实际项目中的挑战。

    GeoStudio学习小记.pdf

    GeoStudio学习小记

    VC学习小记

    《VC学习小记》 学习Visual C++,也就是VC,是一项技术性强且深入的工程,尤其对于初学者来说,需要有良好的C/C++基础作为支撑。C++的基础知识包括语法、面向对象编程概念以及模板等高级特性,这些都是使用MFC...

    d3js 学习小记

    ### D3.js 学习小记 #### SVG基础与D3.js绘图实践 ##### SVG基础 SVG(可缩放矢量图形)是一种基于XML的矢量图像格式,用于描述二维图形以及图形应用。SVG 图像可以被放大、缩小而不会失真,非常适合于网页制作。...

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    LocalCache 学习小记1

    【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...

    104规约规约学习小记

    本章节将重点围绕104规约的学习小记,包括固定长度报文的基本结构、常见帧的类型、报文示例及总召唤命令等几个方面进行详细解析。 #### 二、固定长度报文 固定长度报文是104规约中的一种基本报文形式,其结构相对...

    C++编程小记,经典收藏

    ### C++11 新特性详解 #### 一、Auto 关键字的新用途 - **旧用途**:在C++11之前,`auto`关键字主要用于指定变量的存储期。 - **新用途**:C++11引入了类型推断的概念,`auto`变成了一个类型占位符,用于告诉...

    java 中时间和日期处理的小记

    时间和日期中常用到的几个类: java.util.Date, java.util.Calendar, java.util.GregorainCalendar, java.text.DateFormat, java.text.SimpleDateFormat

    redis安全学习小记1

    Redis是一款高性能的键值存储系统,常用于缓存和数据库应用。本文主要探讨Redis的安全问题,包括连接方式、数据加密、认证机制、数据备份以及主从复制等方面。 首先,Redis的默认配置可能存在安全风险,例如它允许...

    SQL学习小记

    标题 "SQL学习小记" 暗示了这篇博客文章主要关注的是SQL语言的学习和实践。SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言。以下是对这个主题的详细探讨: SQL基础: 1. 数据类型:SQL...

    linux+java+python3+numpy+stl的3d打印小记

    在本项目中,我们将探索如何利用Linux操作系统,Java编程语言,Python3,NumPy库以及STL文件格式来实现3D打印技术。这是一个跨学科的综合应用,涉及到计算机科学、软件开发以及制造技术。 首先,Linux是开源的操作...

    单元测试学习小记

    单元测试学习小记软件测试什么是单元测试单元在程序里可以简单的理解为一个模块,一个方法。单元测试也就是在完成每个模块后都进行的测试。从确保每个模块没有问题,从而提高整体的程序质量。做单元测试的好处对于...

    百度paddle课程学习小记(上)

    百度paddle课程学习小记(上)百度paddle课程学习小记(上)Day-1:python基础练习Day-2:《青春有你2》选手信息爬取遇到的问题Day-3《青春有你2》选手数据分析遇到的问题未完待续 百度paddle课程学习小记(上) 第...

    北大青鸟JAVA作业

    【北大青鸟JAVA作业】是针对北京大学青鸟教育体系中JAVA编程课程的作业集合,旨在帮助学员深入理解和掌握JAVA这门编程语言的核心概念与技术。福建赛迪可能是指该作业来源于福建地区的赛迪教育中心,这表明这些作业是...

    android开发小记

    这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,暗示了这是一个关于Android编程的学习过程,可能涵盖了从基础到进阶的不同阶段。 首先,我们关注"源码"这个标签。在Android开发中...

    VC数据库编程小记ADO访问SQL Server2005

    在进行 VC 数据库编程的过程中,使用 ADO(ActiveX Data Objects)访问 SQL Server2005 是一个非常实用的技术。ADO 作为 Microsoft 提供的一套用于访问数据库的对象模型,它基于 OLE DB 技术,提供了更高级别的接口...

    CAPWAP学习小记

    CAPWAP(Control and Provisioning of Wireless Access Points)协议是一种用于无线接入点(AP)与无线控制器(AC)之间通信的标准化协议。该协议的主要目标是解决大规模无线网络部署中的管理和配置难题,使得瘦AP...

Global site tag (gtag.js) - Google Analytics