`
accpxudajian
  • 浏览: 458083 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
事实上网络编程简单的理解就是两台计算机相互通讯数据而已.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.
Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.
ServerSocket server=new ServerSocket(6789);
这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.
Socket client =new Socket(InetAddress.getLocalHost(),5678);
上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于I\O操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.
服务器端代码:
BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());

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();
}
}
客户端代码:
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();
}
}
多线程实现多用户同时发送请求
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();
}
}
}

>>6对Socket的进一步理解(Socket表示两台计算机之间的连接,就好像是web中的session---会话) (注意:关于会话的注释都是自己的理解)
什么是Socket?进一步理解socket
在Java.net类库中通过构造一个ServerSocket类的实例,使服务器能够检测到指定端口的信息。用ServerSocke中的accept()方法可以使服务器检测到指定端口的活动(获得会话)。      
Socket类的实例代表客户与服务器连接成功(开始会话)。通过编程可以使多个用户通过同一个端口与服务器相连,其中都是Socket 类的实例。
域名使用套接字:Socket mySocket=new Socket("www.cpcw.com",100);
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。
。在连接成功时,应用程序两端都会产生一个Socket实例(各自产生一个会话对象),操作这个实例,完成所需的会话。(这种说法套接字有点像会话--session)

Server-Client模型的程序开发原理:

  服务器使用ServerSocket监听指定的端口port,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接

  客户端使用Socket对网络上某一个服务器的某一个端口port发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

实例:注意Socket关于会话的注释
服务器端
import java.io.*;
import java.net.*;
public class MyServer
{
private ServerSocket ss; //服务器Socket
private Socket socket;  //用于与客户端建立会话
private BufferedReader in;  //用于读取客户端输入流
private PrintWriter out;//用于向客户端暑促信息
private String mess="";//用于接收用户输入的信息,mess==end是 退出会话
public MyServer()
{
  try{
   ss = new ServerSocket(4555);
   System.out.println("服务器已经启动.");
   //循环接受客户端会话请求  每建立一个连接,就创建一个socket对象(理解为会话对象)  
   while(!mess.equals("end"))
   {
    socket = ss.accept(); //创建会话
    System.out.println("会话创建成功");
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()))

    /*BufferedReader类用于对某一个流进行读取,所以构造要指定读取哪一个流BufferedReader()*/
    out = new PrintWriter(socket.getOutputStream(),true);

/*PrintWriter向某一个输出流对象写入或打印信息,所以构造需指定哪个输出流对象,true表示自动行刷新*/
    mess = in.readLine();

    System.out.println("您输入得是:"+mess);
    out.println("您输入得是:"+mess); //PrintWriter的println方法输出数据后关闭流,write输出后不关闭流;
    out.close();
    in.close();
    socket.close();
   }
   System.out.println("服务器会话结束.");
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
}
public static void main(String[] ags)
{
  new MyServer();
}
}
客户端:
import java.io.*;
import java.net.*;
public class  MyClinet
{
private Socket socket; //用于与服务器建立连接(会话)
private BufferedReader in; //用于读取服务器发送数据
private PrintWriter out;//用于向服务器发总数据
private String mess =""; //用于接收自己输入的数据,如果mess==end 退出会话
public MyClinet()
{
  try{  
   while(!mess.equals("end"))//结束会话的条件
   {
    socket = new Socket(InetAddress.getByName("localhost"),4555); //与指定ip的指定端口开启对话
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得服务器端对客户端的输入流
    BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); //获得客户端对服务器端的输出路,数据从控制台键盘输入
    out = new PrintWriter(socket.getOutputStream(),true); //true表示是否带自动行刷新的 PrintWriter
      mess = line.readLine();
    out.println(mess);//客户端向服务器端写入信息,消息来源于控制台的输入
//PrintWriter的println方法输出数据后关闭流,write输出后不关闭流;
    String line2 = in.readLine(); //客户端读取服务器端的响应消息
    System.out.println("服务器反映信息:"+line2);
    //line.close();
    
   }
   //关闭资源
   in.close();
   out.close();
   socket.close();
  }
  catch(Exception e){
   e.printStackTrace();
  }
}
public static void main(String[] args)
{
  new MyClinet();
}
}


>> do-while和while的区别:
       do{。。。}while(condition) 先执行代码段,再做条件conditions的判断。(保证第一次必须执行,然后再修改条件)
     while(condition){。。。}    先进行条件conditions的判断,再执行代码段

>>涉及try-catch --finally的处理
try{}
catch (IOException e)
{
  System.out.println (e.toString ());
}
finally
{
       //嵌套try--catch语句
  System.out.println ("Closing Connection...\n");
  try
  {
     if (br != null)
      br.close ();

     if (pw != null)
      pw.close ();

     if (s != null)
       s.close ();
    }
  catch (IOException e)
  {

                  e.printStackTrace();
  }
}

网上关于socket的资源:
http://www.xici.net/b391997/d26128587.htm
http://hi.baidu.com/jilusuoyouyizouguoderizi/blog/item/4b8508c2541c795db319a88f.html
Socket web帮助文档http://www.alhem.net/jsockets/javadoc/
视频资源:
http://www.enet.com.cn/eschool/zhuanti/java/ (孙鑫)
http://v.youku.com/v_show/id_XNzk2NTg4OTY=.html(尚学堂)
http://so.youku.com/search_video/q_TCP%20Socket
http://v.youku.com/v_show/id_XNzYyNjk1NzI=.html
http://so.youku.com/search_video/q_Socket
http://v.youku.com/v_show/id_XMjk3MTM3OTI=.html


分享到:
评论

相关推荐

    HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_

    【标题】"HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_" 提供的知识点主要集中在使用C#编程语言实现基于TCP协议的Socket通信上,并且涉及到一个名为"HPSocket.Net"的库。HPSocket.Net是针对.NET...

    c#超级Socket库SuperSocket,SOCKET多线程编程

    **SuperSocket库详解** SuperSocket是一款高性能、轻量级的C# Socket服务器开发框架,它为开发者提供了构建基于TCP/IP协议的应用程序的便利工具。在.NET平台上,SuperSocket以其易于扩展和高度定制化的特性,成为了...

    SuperSocket Socket C# 通讯详细介绍

    **SuperSocket Socket C# 通讯详解** 在C#编程领域,网络通信是一个不可或缺的部分,而SuperSocket则是一个强大且易用的.NET Socket服务器框架。它为开发者提供了构建自定义网络应用服务的基础,使得处理TCP连接变...

    Android基于Socket聊天最终版

    在本项目中,“Android基于Socket聊天最终版”是一个实现了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:服务器端、客户端和数据库管理。通过Socket编程,Android设备可以作为...

    SuperSocket-master_Socket基于TCP、UDP

    **SuperSocket:强大的.NET Socket框架** SuperSocket是一个高度可扩展且易于使用的.NET Socket服务端开发框架,它简化了基于Socket的网络应用开发过程。SuperSocket提供了丰富的API和强大的功能,使得开发者可以...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    在Android开发中,Socket通信是实现设备间网络通信的一种常见方式。Socket分为客户端(Socket Client)和服务器端(Socket Server),它们共同构成了基于TCP/IP协议的通信模型。本篇文章将详细探讨Android环境下如何...

    android socket通信实例程序

    在Android平台上进行网络通信时,Socket通信是一种常见且重要的方式,尤其在实现设备间的数据交换、服务器客户端交互等场景。本实例程序主要涉及到的是Android应用如何利用Socket进行TCP(Transmission Control ...

    SocketTool (TCP/UDP Socket 调试工具 V2.2)

    SocketTool是一款功能强大的TCP/UDP Socket调试工具,版本为V2.2,它为开发者提供了便利的网络通信测试环境。Socket编程是计算机网络编程的基础,主要用于实现不同设备间的通信。这款工具能够帮助开发者模拟Socket...

    SocketTool(很好用的socket测试工具)

    SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。 它可以帮助网络编程人员、网络维护人员检查所开发的网络应用软硬件的通信状况。 是一款非常好用...

    跨平台的socket库,windows-linux-socket

    在IT行业中,网络编程是构建分布式系统和互联网应用程序的基础,而Socket编程是网络通信的核心。本文将深入探讨“跨平台的socket库,windows-linux-socket”这一主题,旨在帮助开发者理解如何在Windows和Linux操作...

    socket.io,socket.io-client下载

    Socket.IO和Socket.IO-Client是两个非常重要的库,主要用于实现实时双向通信,尤其是在Web开发领域。它们使得JavaScript客户端(浏览器)与Node.js服务器之间能够建立WebSocket风格的连接,提供了强大的实时通信解决...

    socket test 测试工具

    Socket测试工具是网络编程中非常重要的辅助软件,主要用于检测和调试基于Socket协议的网络通信问题。Socket,也称为套接字,是应用层与传输层之间的接口,它允许应用程序通过TCP/IP协议进行数据交换。在开发网络应用...

    Android安卓使用iosocket进行Socket通信简单封装优雅写代码

    在Android平台上,Socket通信是应用程序之间进行数据交换的重要方式,特别是在需要实时通信或者低延迟的场景下,如游戏、聊天应用等。`io.socket`库是Android开发者常用来实现WebSocket和TCP/IP Socket通信的一个...

    c# socket设置代理

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 创建代理IPEndPoint IPEndPoint proxyEndpoint = new IPEndPoint(IPAddress.Parse(proxyHost), proxyPort);...

    C#raw Socket编程

    C#raw Socket编程 C#raw Socket编程是指使用C#语言实现原始套接字(Raw Socket)的编程技术。原始套接字是一种网络编程接口,允许开发者在应用层实现网络封包监视和控制。 Windows Sockets 是一种网络编程接口,...

    基于HP_Socket框架的socket通讯源码

    HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 此源码为基于HP_Socket框架的socket通讯源码。方便二次...

    TCP/UDP socket 调试工具

    TCP/UDP socket 调试工具 TCP/UDP socket 调试工具 SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。她可以帮助网络编程人员、网络维护人员检查所...

    基于HPSocket实现 socket 通讯 - 修正版 ( C# demo 、 C++ dll )

    在IT行业中,网络通信是至关重要的一个领域,而Socket编程是构建网络应用程序的基础。本资源“基于HPSocket实现socket通讯 - 修正版 ( C# demo 、 C++ dll )”提供了一种实用的方法,帮助开发者高效地实现跨平台的...

    HPSocket.lib和HPSocket_D.lib和所需头文件

    HPSocket是一款强大的网络通信组件,它为程序员提供了一套高效、稳定且易于使用的网络编程接口。这个组件包括了静态库HPSocket.lib和动态库HPSocket_D.lib,以及一系列必要的头文件,使得开发者可以在自己的项目中...

    socket错误代码对应表

    ### Socket错误代码对应表 #### 引言 在进行网络编程的过程中,经常会遇到各种各样的错误,特别是当涉及到Socket通信时。了解这些错误的具体含义及其解决方法对于开发人员来说至关重要。本文将详细介绍一些常见的...

Global site tag (gtag.js) - Google Analytics