`
lshh83
  • 浏览: 162574 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Socket网络编程初级入门

阅读更多
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。

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

  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"用来做退出标识。

  这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?

  其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

  服务器:
import java.io.*;
import java.net.*;

public class MyServer {
 public static void main(String[] args) throws IOException{
  ServerSocket server=new ServerSocket(5678);
  while(true){
   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();
  }
 }
}

  这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。

  那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:
import java.net.*;
import java.io.*;

public class MultiUser extends Thread{
 private Socket client;

 public MultiUser(Socket c){
  this.client=c;
 }

 public void run(){
  try{
   BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
   PrintWriter out=new PrintWriter(client.getOutputStream());
   //Mutil User but can't parallel
   while(true){
    String str=in.readLine();
    System.out.println(str);
    out.println("has receive....");
    out.flush();
    if(str.equals("end"))
     break;
   }
   client.close();
  }catch(IOException ex){
  }finally{
 }
}

public static void main(String[] args)throws IOException{
 ServerSocket server=new ServerSocket(5678);
 while(true){
  //transfer location change Single User or Multi User
  MultiUser mu=new MultiUser(server.accept());
  mu.start();
 }
}
}

  我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道.同样我们可以填写run方法,把之前的操作交给线程来完成,这样多客户并行的Socket就建立起来了。
分享到:
评论

相关推荐

    网络编程网络编程网络编程网络编程网络编程网络编程

    "Java Socket网络编程初级入门"和"Java网络编程基础"系列文档可能是针对初学者的教程,详细讲解了如何使用Java进行网络通信,包括创建服务器、连接服务器、发送和接收数据等基本步骤。 "007.pdf"和"Chapter07"这两...

    java基础之网络编程讲解,适合初级人员入门学习

    ### Java基础之网络编程讲解——适合初级人员入门学习 #### 一、网络编程概述 Java 网络编程是 Java 开发中一个重要的分支,它允许开发者创建可以在网络上进行通信的应用程序。对于初学者来说,理解网络编程的基本...

    Java核心编程Java 课件ppt

    12. **网络编程**:学习Socket编程,理解TCP和UDP协议,以及ServerSocket和Socket类的使用。 13. **反射**:理解如何在运行时动态地获取类的信息,创建并调用对象的方法。 14. **枚举与注解**:学习Java中的枚举...

    java网络编程.doc

    在这个文档中,我们将深入探讨Java语言在网络编程中的基本概念,并提供初级入门的指导。以下是对这些概念的详细解析: 首先,我们来理解Java的基本概念。Java是一种面向对象的、跨平台的编程语言,由Sun ...

    Java安全性编程实例.zip_java入门

    本资源"Java安全性编程实例.zip"针对初级Java开发者提供了深入理解安全编程的基础知识,特别关注了SSL(Secure Socket Layer)和HTTPS(Hypertext Transfer Protocol Secure)这两项核心的网络安全技术。 Java入门...

    Java经典编程300例.zip

    最后,书中还会涵盖一些实用的Java库,如Java Swing用于创建图形用户界面,JavaFX进行现代桌面应用开发,以及Java的网络编程API,如Socket和ServerSocket,这些都能帮助读者构建完整的应用程序。 通过阅读《Java...

    Java编程入门第1章测验Java开发Java经验技巧共2

    3. **文件系统与网络编程**:使用NIO(New IO)进行文件操作,以及Socket通信。 4. **数据库连接**:JDBC基础知识,如连接数据库、执行SQL语句、处理结果集。 5. **设计模式**:学习并实践常见的设计模式,如单例...

    Java基础入门.rar

    在压缩包中,"Java基础入门"可能包含了一系列初级到中级的Java编程教程或实例。这些源码可能是逐步引导读者理解基本语法、数据类型、控制结构、类与对象、继承、多态、异常处理等核心概念的示例。通过实际编写和运行...

    socket初学,高手勿BS

    "socket初学,高手勿BS"这个标题暗示我们将探讨Socket编程的初级概念,适合初学者入门。描述中提到的编译过程和运行命令,表明我们有两个Java程序,一个是MyServer,另一个是MyClient,它们将通过Socket进行交互。 ...

    Java游戏编程初步

    在Java游戏中编程是一个充满挑战和乐趣的领域,它结合了..."Java游戏编程初步.txt"这个文件可能是介绍这些概念的初级教程,对于初学者来说是一个很好的起点。通过深入学习和实践,你可以逐步掌握Java游戏开发的艺术。

    java初级程序员技术大集合

    7. **网络编程**:Java的Socket编程允许开发网络应用程序,如客户端-服务器架构的应用。学习TCP和UDP协议,以及如何使用Socket和ServerSocket进行网络通信,对于开发分布式系统至关重要。 8. **其他技术**:Java还...

    java 整理实例入门教程

    对于网络编程,Java提供了丰富的API,如Socket编程,可以让开发者创建网络应用。而多线程则让Java能够高效地执行并发任务,这是现代计算环境中非常重要的特性。 最后,Java SE(标准版)和Java EE(企业版)的区别...

    java入门经典 2013 代码

    Java的I/O流API支持对文件的读写操作,而Socket编程则使Java能够实现客户端-服务器通信。 在学习过程中,读者还可能接触Java的GUI(图形用户界面)编程,例如使用Swing或JavaFX创建桌面应用。这些库提供了一系列...

    java初级笔记.rar

    总的来说,这份“java初级笔记”是一份全面的入门资料,覆盖了从基础语法到核心概念的各个方面。通过系统学习,新手可以逐步建立起对Java编程的理解,为进一步深入学习和实际开发打下坚实的基础。

    java私塾跟我学系列-java篇

    8. **网络编程**:Java提供Socket编程接口,可以创建基于TCP/IP的客户端和服务端应用程序。 9. **反射**:Java反射机制允许在运行时动态获取类的信息并操作类的对象,是Java的重要特性之一。 10. **泛型**:泛型是...

    Java编程思想第4版_PDF密码解除1

    特别地,书中详细讨论了Java的网络编程,这是Java的一个重要应用领域,涵盖Socket通信和HTTP协议等。此外,书中还详细讲解了Java的多线程处理,这对于理解和编写并发应用程序至关重要。 《Thinking in Java》的第16...

    javajava初级教程新手学习中

    Java提供了丰富的网络编程API,如Socket和ServerSocket,可以用来创建客户端和服务器应用程序。 十、Java Swing和JavaFX 这两者都是Java的图形用户界面(GUI)库,用于创建桌面应用。Swing是早期的选项,而JavaFX...

    Java初级案例源码荟萃

    Java作为一门广泛应用于互联网开发的编程语言,是许多初学者入门的选择。"Java初级案例源码荟萃"是一个集合了多种基础Java编程实践的资源包,旨在帮助新手快速理解和掌握Java编程的基础概念和技巧。这个资源包包含了...

    java外包笔试题两套.zip

    "java外包笔试A卷.docx"可能是入门或初级程序员的考核试题,可能包含以下知识点: 1. **Java基础**:包括类、对象、封装、继承、多态等面向对象概念,以及异常处理、数据类型、运算符、流程控制语句等基础知识。 2...

Global site tag (gtag.js) - Google Analytics