`

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学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

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

    在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    Java学习笔记(源码)

    【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

    java校招学习笔记

    "java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...

    Java学习笔记(必看经典).doc

    这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...

    良葛格JAVA 学习笔记

    《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...

    java学习笔记(全)

    Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...

    JAVA 自己的学习笔记总结

    ### JAVA学习笔记:Socket通信详解 #### 一、Socket通信概念与原理 Socket通信是Java网络编程中的核心概念,它提供了在不同计算机之间进行数据交换的能力。Socket可以被视为两个程序间进行通信的端点,一个Socket...

    java深入学习笔记.pdf

    "java深入学习笔记.pdf" java是一种广泛应用的编程语言,具有平台独立性、对象oriented、分布式处理等特点。在java深入学习笔记.pdf中,我们可以学习到以下知识点: 一、java基础知识 * 变量声明:在java中,变量...

    良葛格java学习笔记

    《良葛格java学习笔记》是一份集合了Java学习精华的资源,主要针对初学者和对Java编程感兴趣的读者。这份笔记是由用户从良葛格的网站上精心整理并转化为CHM格式,便于阅读和查阅。CHM(Compiled Help Manual)是微软...

    林信良java学习笔记

    《林信良Java学习笔记》是一本深受程序员喜爱的Java学习资源,尤其因其繁体字版,对于中文读者来说,提供了更为亲切的阅读体验。这本书深入浅出地讲解了Java编程语言的基础知识和高级特性,旨在帮助初学者快速掌握...

    Java专题学习笔记

    Java专题学习笔记主要涵盖了Java语言的核心概念、进阶特性以及实际应用中的问题解析。这份笔记是结合了讲师的讲解和个人的整理,旨在为热爱Java编程的朋友们提供丰富的学习资源。以下将详细介绍其中可能包含的知识点...

    Java学习笔记(整理)

    这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...

    java精华学习笔记

    Java精华学习笔记主要涵盖了Java编程语言的核心概念、关键特性以及实战技巧。这些笔记是作者在深入学习Java过程中积累的经验总结,旨在帮助初学者快速理解和掌握Java编程。 1. **Java基础** - **数据类型**: Java...

    JAVA6学习笔记 最新版的

    Java 6学习笔记是针对初学者和有一定经验的开发者提供的一份全面的教育资源,它涵盖了Java编程语言的基础到高级概念。这份笔记旨在帮助读者深入理解Java 6的关键特性,提高编程技能,并为实际项目开发打下坚实基础。...

    java se学习笔记

    【Java SE学习笔记】是针对Java初学者的一份详实的学习资源,主要涵盖了Java的基础知识、进阶概念以及编程实践。这份笔记以HTML格式呈现,方便读者在线阅读或下载后离线浏览。以下是对这份笔记可能包含的重要知识点...

    java学习笔记

    网络编程也是Java的一大亮点,Java学习笔记会介绍Socket编程,使读者能够创建基于TCP/IP的客户端和服务端应用程序。此外,还会涉及多线程编程,这是并发处理和提高程序性能的关键技术,包括线程的创建、同步和通信。...

Global site tag (gtag.js) - Google Analytics