`

Java Socket 学习笔记

 
阅读更多

Socket:英文中的意思是插座。

两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。

Java中所有关于网络编程的类都位于java.net包。

一、TCP的socket编程

TCP编程需要使用的两个类:Socket类与ServerSocket类,

分别用来实现双向连接的Client端和Server端。

说明:这里仅指TCP连接。因为UDP中没有Client和Server的概念。UDP只负责发送,不管是否发生成功。

 

建立连接时所需要的寻址信息为远程计算机的IP地址和端口号。

说明:

1.一个端口号只能被一个应用程序占用。

2.1024以下的端口号都由系统使用。普通应用程序不应该去占用。

3.比较有名的应用程序占用某个特定的端口号,一般也不该去占用。

    如HTTP端口,80端口。

        FTP,21端口。

        SMTP,25端口。

        接受邮件,110端口。

 

说明:TCP端口与UDP端口是两个不同的概念。TCP端口有65535个端口,UDP端口也有65536个端口。TCP的8888端口与UDP的8888端口是两个不同的概念。

 

ServerSocket的构造函数

ServerSocket()

ServerSocket(int port)

创建非绑定服务器套接字。

创建绑定到特定端口的服务器套接字。

ServerSocket常用API

Socket accept()  侦听并接受到此套接字的连接。该方法为阻塞方法,当没有接收到新的网络连接前是不会继续执行的。 

 

 

Socket的构造函数

Socket()

Socket(String host, int port)

若没建立连接会抛出异常。

 

 

 

 

例程

例:TCP的Server端

 

import java.net.*;
import java.io.*;

public class TCPServer {
    public static void main(String[] args) throws Exception {
	ServerSocket ss = new ServerSocket(6666); //建立监听
	while(true) {
		Socket s = ss.accept();//等待请求。若请求,则创建Socket,即建立连接。
System.out.println("a client connect!");
                //输入流
		DataInputStream dis = new DataInputStream(s.getInputStream());
		System.out.println(dis.readUTF());//从流中读出信息。
		dis.close();//关闭流。
		s.close();//关闭socket。
	}
    }
}

 

 

例:TCP的Client端

 

import java.net.*;
import java.io.*;

public class TCPClient {
    public static void main(String[] args) throws Exception {
	Socket s = new Socket("127.0.0.1", 6666); //建立Socket,寻址,申请连接。
	OutputStream os = s.getOutputStream(); //使用流做通信。输出流
	DataOutputStream dos = new DataOutputStream(os);
	Thread.sleep(30000);
	dos.writeUTF("hello server!");//以UTF-8的编码将数据写入流。
	dos.flush();    //压出流中所有信息。
	dos.close();    //关闭流。
	s.close();      //关闭socket。
    }
}

 

 

说明:

1. 网络应用程序的编程过程中,应该先启动Server再启动Client。而编程过程是Server与Client是同时编写的。

2. ServerSocket类的accept()方法是阻塞式的方法,即若没有接受到连接,则停止在该方法,不再继续执行。

3. 在例程中readUTF()方法也是阻塞式的方法。

4. Client端的端口是系统自动选择的,我们不需要去关注。

 

 

例程的缺点

1. 由于Server端的readUTF()方法是阻塞式的。Server需要等待Client发送数据才会继续执行,所以将会导致accept()方法无法执行。

2. 由于readUTF方法是阻塞方式的。所以如果read()和write()方法是在同一个处理过程中,必须是一段是先读后写,另一端是先写后读。若两个都是先后后写,则Server端和Client都不会继续执行。

 

 

 

 InetAddress:IP地址的超集。除了IP地址。还可以表示其他通信协议的地址。

 

 

 

 

二、UDP编程

UDP是不可靠的。UDP是基于数据报的形式发送数据。(TCP也本质也以数据报发送,但安全性强。)

对与UDP没有Server与Client的概念。

UDP编程中最重要的两个类:DatagramPacket与DatagramSocket

DatagramPacket类:

DatagramSocket类:

 

例程:

例:UDP的Server端

 

import java.net.*;
import java.io.*;

public class TestUDPServer
{
    public static void main(String args[]) throws Exception
    {
	byte buf[] = new byte[1024];
        //创建数据报。
	DatagramPacket dp = new DatagramPacket(buf, buf.length);  //该数据报与字节数组关联。
	DatagramSocket ds = new DatagramSocket(5678);    //占用5678端口。
	while(true)
	{
	    ds.receive(dp);//接受数据报。并把数据报传递至dp。即数据报中的数据存入buf。
	    ByteArrayInputStream bais = new ByteArrayInputStream(buf);  //从字节数组(源)接上读取流。
	    DataInputStream dis = new DataInputStream(bais);  //用Data流包装读取流。
	    System.out.println(dis.readLong());  //从Data流中读取数据。
        }
    }
}
 

 

 

例:TCP的Client端

 

import java.net.*;
import java.io.*;

public class TestUDPClient
{
    public static void main(String args[]) throws Exception
    {
        //首先将一个long数,装为字节数组。
	long n = 10000L;
	ByteArrayOutputStream baos = new ByteArrayOutputStream();  //创建写入内存的流(字节数组流)。该流用于向内存写数据。
	DataOutputStream dos = new DataOutputStream(baos);    //用数据流包装内存流。
	dos.writeLong(n);        //向数据流中写入long数。数据流负责把任何类型的数据写到内存流。通过内存流数据写到内存中。
	byte[] buf = baos.toByteArray(); //从内存流(字节数组流)中得到long数的byte数组。

        //创建数据报。
	DatagramPacket dp = new DatagramPacket(buf,
                                               buf.length,
                                               new InetSocketAddress("127.0.0.1", 5678)
                                               );
	DatagramSocket ds = new DatagramSocket(9999);  //占用9999端口。
	ds.send(dp);    //发送数据报。
	ds.close();     //关闭通信socket。
		
    }
}
 

 

 

说明:

DatagramSocket类的receive()方法阻塞式的方法。

InetAddress类继承了SocketAddress类。

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java学习笔记 精华

    java学习笔记,学习中的错误总结,编程经验

    java学习笔记 初学者必读

    1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...

    学习笔记:多线程Java Socket编程示例

    其中采用Java 的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求....注意,此为学习笔记,可以作为参考学习使用,不建议商业使用或生产使用。 废话不多说,直接上代码。

    socket 学习笔记

    socket学习笔记................................

    Socket TCP Java 高清学习资料合集

    包括 1.TCP-IP详解卷1:协议 中文版PDF 2.高级TCP/IP编程 中文版PDF 3.TCPIP Sockets in Java 2nd 英文版PDF, 4.Advanced JAVA networking英文版PDF ...5.中文版Socket Java教程 6.Socket Java学习笔记 7.UDP简单案例

    java内部学习笔记.docx

    Java技术基础 4 1.1编程语言 4 1.2 Java的特点 4 1.3 Java开发环境 4 1.4 Java开发环境配置 5 1.5 Linux命令与相关知识 5 1.6 Eclipse/Myeclipse程序结构 6 ...5.13 Socket网络编程 65 5.14线程池 67 5.15双缓冲队列 68

    Java Socket编程笔记_动力节点Java学院整理

    Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socket、ServerSocket、多线程这几个方面阐述

    Socket基础知识笔记

    可以学习下!关于socket 这项技术,很多项目都应用到,掌握了解对你一定有一定的益处!

    JAVA网络编程

    Java网络编程---IO部分学习笔记整理 .doc Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三...

    [Java]详解Socket和ServerSocket学习笔记

    即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求,这会,Socket对于我们来说就非常实用了。本篇文章主要介绍了Socket和ServerSocket,有兴趣的可以了解一下。

    socket网络编程学习笔记

    这事我在自学socket网络编程时,通过在网上查找资料,整理的~

    08-java基础汇总学习笔记

    javaSE基础汇总学习笔记整理,javaSE基础、面向对象、IO、反射、常用的类、正则、Socket基础编程等

    Android Java Socket框架 Mina2.0

    Mina2.0框架:客户端Demo,服务器端Demo,根目录下有整理的《Mina2.0学习笔记》

    java高级知识-学习笔记

    ## socket(套接字) ### 1、概念 **socket**也称为”套接字“,它是连接两台计算机的通讯端点,用于在计算机之间实现通讯 ### 2、如何实现通讯 ​ 1、首先要找到网络中的计算机----------------------可以通过...

    android学习笔记4--socket

    简单介绍了网络编程,和简单的使用方法,这部分属于java的基础只是,有必要了解下。

    整理后java开发全套达内学习笔记(含练习)

    Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,指令 subclass n.子类 ['sʌbklɑ:s]' (supertype 父类) switch (关键字) 选择语句。...

    socket 编程 网络编程资料大全 给力

    网络通信协议,网络通信基础知识,socket网络编程的一些基础知识,Socket网络编程学习笔记,网络编程总结,2011-学习资料大全:java_socket编程,学习网络编程的十个步骤,socket编程入门(经典版),Unix_网络编程...

    Socket网络编程进阶与实战系统掌握Socket核心技术

    Socket网络编程进阶与实战系统掌握Socket核心技术,本课程将理论结合实践,带你从零开始,系统学习Socket编程技术,让Socket的学习不再那么零散与难以掌握,同时会提炼出Socket网络传输的核心思想与构架,并带你踩坑...

    Java复习笔记/Java知识点总结

    同时附赠一份我学习的资料,是github上的一位大神写的,非常棒的笔记,力荐!总结了Java知识、IO、http、socket、redis、git、docker,设计层次比较全,大家可以下载看看,注意文档格式是markdown的。

    Java swing + socket + mysql 五子棋网络对战游戏.zip

    学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的...

Global site tag (gtag.js) - Google Analytics