------------------------------------网络编程(Socket)(TCP )

1.Java.net 包提供若干支持基于套接字的客户端/服务器通信的类。

2.java.net包中常有的类有Socket、ServerSocket、DatagramPacket、InetAddress、URL、URLConnection和URLEncoder等

3.为了监听客户端的连接请求,可以使用ServerSocket类。Socket类实现用于网络上进程间通信的套接字.DatagramSocket类使用UDP协议实现客户端和服务器套接字。DatagramPacket类使用DatagramSocket类的对象封装设置和收到的收据情报。InetAddress类表示Internet地址。在创建数据报报文和Socket对象时,可以使用InetAddress类。

,Socket通信模式图

3.2个断点在TCP协议的Socket编程中,经常一个作为客户端,一个作为服务器端。也就是client-server模型,如上图;

4.Socket类

1)Socket对象在客户端和服务器之间建立连接。构造方法创建套接字,并将套接字连接至给定的主机和端口。以下是与此Socket对象关联的构造方法和一些常用方法。

(1)构造方法

第一种构造方法以主机名和端口号作为参数来创建一个Socket对象。创建Socket对象时可能抛出异常UnknowHostException或IOException异常,必须捕捉它们。

Socket s=new Socket(Hhost,port);

两一种构造方法以InetAddress对象和端口作为参数来创建一个Socket对象。创建Socket对象时可能抛出异常UnknowHostException或IOException异常,必须捕捉它们。

Socket s=new  Socket(address,port);

(2)常用方法

InetAddress getInetAddress();//返回与Socket对象关联的InetAddress

int getPort();//返回此Socket 对象所连接的远程端口

int getLocalPort();//返回此Socket对象所连接的本地端口

InputStream getInputStream();//返回与此套接关联的InputStream

OutputStream getOutputStream();//返回于此套接关联的OutputStream

void close();//关闭该Socket

5.ServerSocket类

ServerSocket对象等待客户建立连接,连接建立以后进行通信。

1)构造方法

第一种构造方法接收端口号作为参数创建ServerSocket对象。创建此对象时,可能抛出IOExption异常,必须捕捉和处理。

ServerSocket ss=new ServerSocket(port);

另一种构造方法 接收端口号和最大队列长度作为参数。队列长度表示系统在拒绝连接前可以拥有的最大客户端数。

ServerSocket ss=new ServerSocket(port,maxqu);

Socket类中列出的方法也适用于ServerSocket类。此外,ServerSocket类具有的方法有accept(),此方法用于等待客户端触发通信,这样Socket对象就可用于进一步的数据传送。

6.实现单用户登录

Socket 网络编程一般可以划分如下4个步骤进行:

(1)建立连接

(2)打开Socket关联的输入/输出流

(3)从数据流中写入信息和读取信息

(4)关闭所有的数据流和Socket

.

    /**
     * 客户端
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException, IOException {
        //建立客户端Socket连接,指定服务器的位置为本机立即端口8800
        Socket socket=new Socket("localhost",8800);
        OutputStream os=socket.getOutputStream();
        InputStream is = socket.getInputStream();
        String str="用户名:tom,用户密码:123456";
        os.write(str.getBytes());
        socket.shutdownOutput();
        //接收服务器端的响应,即从输入流读取信息
        String reply=null;
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        while ((reply=br.readLine())!=null){
            System.out.println("我是客户端,服务器的响应为:"+reply);
        }
        br.close();
        is.close();
        os.close();

    }
/**
     * @param args
     * 服务端
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立一个服务器Socket(ServerSocket),指定端口8800bin开始监听
        ServerSocket serverSocket=new ServerSocket(8800);
        //使用accept()方法得到Socket对象
        Socket socket = serverSocket.accept();
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String info=null;
        while ((info=br.readLine())!=null) {
            System.out.println("我是服务器,客户的信息是:"+info);
        }
        String reply="欢迎你,登录成功!";
        os.write(reply.getBytes());
        os.close();
        br.close();
        is.close();
         

2)把对象传递,建一个Student类里面有三个属性和set/get方法

    /**
     * 客户端
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket=new Socket("localhost",8800);
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();
        //序列化对象
        ObjectOutputStream oos=new ObjectOutputStream(os);
        Student student=new Student();
        student.setID(0);
        student.setName("小明");
        student.setSEX("男");
        oos.writeObject(student);
        socket.shutdownOutput();
        //接收服务器端的响应,即从输入流读取信息
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String info=null;
        while ((info=br.readLine())!=null) {
            System.out.println("我是客户端,服务器的信息是:"+info);
        }
        br.close();
        oos.close();
        is.close();
        os.close();

    }
/**
     * @param args
     * 服务端
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //建立一个服务器Socket(ServerSocket),指定端口8800bin开始监听
        ServerSocket serverSocket=new ServerSocket(8800);
        //使用accept()方法得到Socket对象
        Socket socket = serverSocket.accept();
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        ObjectInputStream ois=new ObjectInputStream(is);
        Student student  =(Student) ois.readObject();
        if (student!=null) {
            System.out.println("我是服务器端,客户端的信息是"+student.getID()+student .getName()+student.getSEX());
        }
        String str="欢迎使用!";
        os.write(str.getBytes());
        os.close();
         ois.close();
         is.close();
    }

}

3)实现多个客户端用户登录

    /**
     * 客户端
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */

        public static void main(String[] args) throws UnknownHostException, IOException {
            Socket socket=new Socket("localhost",8800);
            OutputStream os = socket.getOutputStream();
            InputStream is = socket.getInputStream();
            //序列化对象g
            ObjectOutputStream oos=new ObjectOutputStream(os);

            Student student2=new Student();
            student2.setID(2);
            student2.setName("小明");
            student2.setSEX("男");

            oos.writeObject(student2);
            socket.shutdownOutput();
            //接收服务器端的响应,即从输入流读取信息
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("我是客户端,服务器的信息是:"+info);
            }
            br.close();
            oos.close();
            is.close();
            os.close();

        }
//建立多个服务器Socket(ServerSocket),指定端口8800bin开始监听
        ServerSocket serverSocket=new ServerSocket(8800);
public class LoginThread extends Thread{
    Socket socket=null;
    //每启动一个线程,连接响应的Socket
    public LoginThread(Socket socket){
        this.socket=socket;
    }
    //启动线程,即响应客户请求
    public void run(){
        try {
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            ObjectInputStream ois=new ObjectInputStream(is);
            Student student;
            try {
                student = (Student) ois.readObject();
                if (student!=null) {
                    System.out.println("我是服务器端,客户端的信息是"+student.getID()+student .getName()+student.getSEX());
                }
                String str="欢迎使用!";
                os.write(str.getBytes());
                os.close();
                 ois.close();
                 is.close();
            } catch (ClassNotFoundException e) {

                e.printStackTrace();
            }

        } catch (IOException e) {

            e.printStackTrace();
        }

    }
}


    /**
     * 客户端
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket=new Socket("localhost",8800);
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();
        //序列化对象
        ObjectOutputStream oos=new ObjectOutputStream(os);
        Student student=new Student();
        student.setID(0);
        student.setName("小明");
        student.setSEX("男");

        oos.writeObject(student);

        socket.shutdownOutput();
        //接收服务器端的响应,即从输入流读取信息
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String info=null;
        while ((info=br.readLine())!=null) {
            System.out.println("我是客户端,服务器的信息是:"+info);
        }
        br.close();
        oos.close();
        is.close();
        os.close();

    }
        Socket socket=null;
        while (true) {
            socket=serverSocket.accept();
            LoginThread loginThread=new LoginThread(socket);
            loginThread.start();
        }
时间: 2024-10-10 12:47:14

------------------------------------网络编程(Socket)(TCP )的相关文章

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1.基本概念 一.网络:将不同的计算机连接在一起局域网 城域网 互联网 二.地址:Ip地址确定网络上的绝对的地址位置   房子的地址 三.端口号(相当于房门):区分计算机上的软件 相当于房门两个字节0~65535 共65536个 1. 同一个协议下,端口号不能重复,不同的协议下可以重复 2. 1024以下的端口不要使用 80-->http 21-->ftp 四.资源定位 URL 统一资源定位 URI:统一资源 五.数据的传输 1. 协议:

android 网络编程--socket tcp/ip udp http之间的关系

网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络层.链路层通信协议概图.我们经常接触到的一般是: http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的 tcp协议:运输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输 udp协议:运输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

网络编程Socket之TCP之close/shutdown详解(续)

接着上一篇网络编程Socket之TCP之close/shutdown详解 现在我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道write操作返回成功只能说明数据已经发送到套接字的发送缓冲区,不能代表对端已经成功收到数据,close的默认返回成功也只是成功发出了一个FIN分节,也不代表对端已经确认 问题1:如果中途网络发生故障,很有可能服务端接收不到这个来自客户端的FIN分节: 问题2:假设服务器忙,那么来自客户端的数据由TCP加入到套

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR. SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回. SO_L

linux网络编程笔记——TCP

1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直接通过TCP传送结构体,当然前提是收发两端都在程序里对目标结构体有充分的定义.特别说明的一点是,要小心收发两端处理器的大小端问题!而且传输信息头里必须包含长度信息,而且通用的是大端.但是,这里的长度和结构体,我选择用小端进行传输. 3.TCPserver实现 参考了别人多线程的回调写法,看起来不错.

Java网络编程(tcp在服务器上应用多线程)

package org.tcp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class EchoThread implements Runnable { private Socket client = null; public EchoThread(Socket client){ this.c

linux 网络编程 socket bind failed 问题解决

今天写一个简单的socket网络通讯的程序的时候,用ctrl+c结束服务器端程序之后,再次启动服务器出现了bind failed:the address already in use的错误.在网上查了一下以后找到了原因,在此记录一下.这个IBM的官网上说到了这一点:http://www.ibm.com/developerworks/cn/linux/l-sockpit/.详细介绍如下: bind 普遍遭遇的问题是试图绑定一个已经在使用的端口.该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(

网络编程socket基本API详解(转)

网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类

Python 之 网络编程——SOCKET开发

一.预备知识 对于我们,主要掌握5层协议就行. 物理层: 转成二进制数序列数据链路层: 形成统一的协议:Internet协议 包括数据头(18个字节,前6个字节原地址,中间6个字节为目标地址,后6个字节为数据的描述)和数据网络层: 有IP协议,包括IP头和数据传输层: 包括tcp.UDP两个协议:基于端口(0-65535)的协议应用层: 包括http.ftp协议 TCP协议:流式协议,先把管道修好 客户端   服务端 C-------------------------------->S   <