java网络编程

来源:互联网 发布:dz seo 编辑:程序博客网 时间:2024/06/03 11:53

 1、网络:把在不同地理位置的计算机设备通过专用线路连接起来形成一个规模大、功能强的系统,从而可以使计算机方便的相互传递信息和数据等资源。

 2、网络的分类(按规模分):

       1)、局域网(LAN

       2)、城域网(MAN)

       3)、广域网(WAN)

 3、协议

        通信协议是网络通信的基础

        IP(InternetProtocol):又称互联网协议,是支持网间互联的数据报协议,它提供网间互联的完善功能,包括IP数据报规定互联网范围内 的地址格式。

        TCP(Transmission ControlProtocol):传输控制协议,它规定一种可靠的数据信息传递服务。

              类似于三次握手,面向链接,安全可靠  、效率低下(打电话)

        UDP(User DateGram Protocol):非面向链接,效率高(发短信)

             

  4、计算机网络分层

1.TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低

2Java中基于TCP协议实现网络通信的类
客户端的Socket
服务器端的ServerSocket

3.Socket通讯模型

1).创建ServerSocketSocket

2).打开连接到Socket的输入/输出流

3).按照协议对Socket进行读/写操作

4).关闭输入输出流、关闭Socket

4.服务器端:

1).创建ServerSocket对象,绑定监听端口

2)通过accept()方法监听客户端请求

3)连接建立后,通过输入流读取客户端发送的请求信息

4)通过输出流向客户端发送乡音信息

5)关闭相关资源

我们来具体的看一下代码

/**  

 * 基于TCP协议的Socket通信,实现用户登录,服务端 

*/  //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口 //2、调用accept()方法开始监听,等待客户端的连接 Socket socket = serverSocket.accept();  //3、获取输入流,并读取客户端信息 InputStream is = socket.getInputStream();  

InputStreamReader isr =newInputStreamReader(is);  

BufferedReader br =newBufferedReader(isr);  

String info =null;  while((info=br.readLine())!=null){ 

System.out.println("我是服务器,客户端说:"+info) 

}  

socket.shutdownInput();//关闭输入流 //4、获取输出流,响应客户端的请求 OutputStream os = socket.getOutputStream();  

PrintWriter pw = new PrintWriter(os);  

pw.write("欢迎您!"); 

pw.flush();  //5、关闭资源 pw.close();  

os.close();  

br.close();  

isr.close();  

is.close();  

socket.close();  

serverSocket.close();

5、客户端:

1).创建Socket对象,指明需要连接的服务器的地址和端口号

2)连接建立后,通过输出流想服务器端发送请求信息

3)通过输入流获取服务器响应的信息

4)关闭响应资源

我们来具体看一下代码

//客户端 //1、创建客户端Socket,指定服务器地址和端口 Socket socket =newSocket("localhost",10086); //2、获取输出流,向服务器端发送信息 OutputStream os = socket.getOutputStream();//字节输出流 PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流 pw.write("用户名:admin;密码:123"); 

pw.flush();  

socket.shutdownOutput();  //3、获取输入流,并读取服务器端的响应信息 InputStream is = socket.getInputStream();  

BufferedReader br =new BufferedReader(new InputS

6、应用多线程实现服务器与多客户端之间的通信

1)服务器端创建ServerSocket,循环调用accept()等待客户端连接

2)客户端创建一个socket并请求和服务器端连接

3)服务器端接受苦读段请求,创建socket与该客户建立专线连接

4)建立连接的两个socket在一个单独的线程上对话

5)服务器端继续等待新的连接

我们看一下具体代码

//服务器线程处理 //和本线程相关的socket Socket socket =null;  // publicserverThread(Socketsocket){  this.socket = socket;  

}  publicvoid run(){ //服务器处理代码 }  //============================================ //服务器代码 ServerSocket serverSocket =newServerSocket(10086); 

Socket socket =null;  int count =0;//记录客户端的数量 while(true){  

socket = serverScoket.accept();  

ServerThread serverThread =newServerThread(socket);  

 serverThread.start();  

 count++;  

System.out.println("客户端连接的数量:"+count); 

}

7.具体事例

package Socket;

 

import java.net.DatagramPacket;

import java.net.InetAddress;

 

publicclass Dgram {

 

    public staticDatagramPackettoDatagram(Strings, InetAddress destIA,

           int destPort) {

        byte[]buf =new byte[s.length() + 1];

       s.getBytes(0,s.length(), buf,0);

        returnnewDatagramPacket(buf, buf.length,destIA, destPort);

    }

 

    public staticStringtoString(DatagramPacket p) {

        returnnewString(p.getData(), 0, p.getLength());

    }

}

 

 

package Socket;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

classServeOneJabberextends Thread {

    private Socketsocket;

    privateBufferedReader in;

    privatePrintWriter out;

 

    publicServeOneJabber(Sockets)throws IOException {

        socket =s;

        in = newBufferedReader(new InputStreamReader(socket.getInputStream()));

        out = newPrintWriter(new BufferedWriter(new OutputStreamWriter(

               socket.getOutputStream())),true);

        start();

    }

 

    public voidrun() {

        try{

           while (true) {

               String str = in.readLine();

               if (str.equals("END"))

                   break;

               System.out.println("Echoing:" +str);

               out.println("From Server:"+str);

           }

           System.out.println("closing...");

        } catch(IOException e) {

        } finally{

           try {

               socket.close();

           } catch (Exception e2) {

           }

        }

    }

}

 

publicclass MultiJabberServer {

    static finalint PORT =8080;

 

    public staticvoidmain(String[]args)throws IOException {

       ServerSocket s =new ServerSocket(PORT);

       System.out.println("ServerStarted");

        try{

           while (true) {

               Socket socket = s.accept();

               try {

                   new ServeOneJabber(socket);

               } catch (IOException e) {

                   socket.close();

               }

           }

        } finally{

           s.close();

        }

    }

 

}

 

 

package Socket;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;

 

classJabberClientThreadextends Thread {

    private Socketsocket;

    privateBufferedReader in;

    privatePrintWriter out;

    private staticint counter =0;

    private intid = counter++;

    private staticint threadcount =0;

 

    public staticintthreadCount() {

        returnthreadcount;

    }

 

    publicJabberClientThread(InetAddressaddr) {

       System.out.println("Making client" + id);

       threadcount++;

        try{

           socket =new Socket(addr, MultiJabberServer.PORT);

        } catch(IOException e) {

        }

        try{

           in = new BufferedReader(new InputStreamReader(

                   socket.getInputStream()));

           out = new PrintWriter(new BufferedWriter(newOutputStreamWriter(

                   socket.getOutputStream())),true);

           start();

        } catch(IOException e) {

           try {

               socket.close();

           } catch (IOException e2) {

           }

        }

    }

 

    public voidrun() {

        try{

           for (int i =0; i<25; i++) {

               out.println("Client " +id +":" + i);

               String str = in.readLine();

               System.out.println(str);

           }

           out.println("END");

        } catch(IOException e) {

        } finally{

           try {

               socket.close();

           } catch (IOException e2) {

               threadcount--;

           }

        }

    }

}

 

publicclass MultiJabberClient {

    static finalint MAX_THREADS =40;

 

    public staticvoidmain(String[]args)throws IOException,

           InterruptedException {

       InetAddress addr = InetAddress.getByName(null);

        while(true) {

           if (JabberClientThread.threadCount() < MAX_THREADS)

               new JabberClientThread(addr);

           Thread.currentThread().sleep(100);

        }

    }

}

 

0 0
原创粉丝点击