码迷,mamicode.com
首页 > 编程语言 > 详细

Java网络编程学习

时间:2016-07-10 01:01:29      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

     服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者相互通信。但有时在某个网络中很难将服务器与客户机区分开。我们通常所说的“局域网”(Local Area Network,LAN),就是一群通过一定形式连接起来的计算机。它可以由两台计算机组成,也可以由同一区域内的上千台计算机组成。由LAN延伸到更大的范围,这样的网络称为“广域网”(Wide Area Network,WAN)。我们熟悉的因特网(Internet),则是由无数的LAN和WAN组成。

     一般而言,一台计算机只有单一的连到网络的“物理连接”(Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机。这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机通过不同的端口来确定连接到服务器的哪项服务上,如下图所示。

技术分享

     网络程序中套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插插头的设备“插座”,用于连接电器与电线,如下图所示。Java将套接字抽象化为类,程序设计者只需创建Socket类对象,即可使用套接字。

 技术分享

TCP程序设计:

步骤:

1、  服务器创建ServerSocket,调用accept()方法等待客户机请求。

2、  客户端创建Socket,请求服务器。

3、  服务器接收请求,accept()方法返回一个Socket,从而建立连接。

InetAddress类——IP相关

技术分享

ServerSocket类——服务器套接字

主要功能是等待来自网络上的“请求”,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50。

构造函数:

ServerSocket() throws IOException

ServerSocket(int port) throws IOException

ServerSocket(int port, int backlog) throws IOException

ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException

java socket中有两个流,
一个是输入流getInputStream,用于读取socket发送过来的数据,就是接收消息用的。
另一个是输出流getOutputStream,用于向socket端发送数据,就是发送消息用的。

代码示例:

TCPServer.java

 

/*
 * TCPServer
 * @author ChenMing
 * @version 2016-7-10
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
    public static void main(String[] args) {
        try{
            /*******************************监听并连接***********************************/
            ServerSocket serverSocket = null ; 
            try{
                serverSocket = new ServerSocket(4000) ; //创建一个端口监听
            }catch(Exception e){
                e.printStackTrace();
            }
            Socket socket = null ; 
            try{
                System.out.println("服务器开启!");
                socket = serverSocket.accept() ; //一直阻塞,直到接收到请求,返回一个Socket
            }catch(Exception e){
                e.printStackTrace();
            }
            
            /*******************************接收连接***********************************/
            //由socket对象得到输入流,并构造相应的BufferedReader
            BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
            try{
                while(true){
                    System.out.println("服务器收到:"+read.readLine());
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            /*******************************关闭连接***********************************/
            try{
                if (read!=null)
                    read.close();
                if (socket!=null)
                    socket.close();
                if (serverSocket!=null)
                    serverSocket.close();
                System.out.println("服务器关闭!");
            }catch(Exception e){
                e.printStackTrace();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

 

TCPClient.java

/*
 * TCPClient
 * @author ChenMing
 * @version 2016-7-10
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TCPClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            /*******************************请求连接***********************************/
            //向本机的5000端口发出客户请求
            Socket socket = null ;
            socket = new Socket("127.0.0.1", 4000)  ;
            //由系统标准输入设备构造BufferReader对象
            System.out.println("客户端连接成功!");
            /*******************************传输数据***********************************/
            BufferedReader in = null ; 
            in = new BufferedReader(new InputStreamReader(System.in)) ; 
            //由Socket对象得到输出流,并构造PrintWriter对象
            PrintWriter writer = null ; 
            writer = new PrintWriter(socket.getOutputStream()) ; 
            try{
                while(true){
                    writer.println(in.readLine()); //将从系统标准输入读入的字符串输出到Server
                    writer.flush(); //刷新输出流,使Server马上收到该字符串
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            /*******************************关闭连接***********************************/
            try{
                if(in!=null)
                    in.close(); 
                if(writer!=null)
                    writer.close();
                if(socket!=null)
                    socket.close();  
                System.out.println("客户端连接断开!");
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

 

Java网络编程学习

标签:

原文地址:http://www.cnblogs.com/xmu-chenming/p/5656919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!