Socket

事实上网络编程简单的理解就是两台计算机相互通讯数据而已.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值