Java网络编程

Java网络编程

网络编程的目的就是直接或间接地通过网络协议与其他计算机进行通信。

Java网络编程基础知识

网络分类

计算机网络是指将有独立功能的多台计算机,通过通信设备线路连接起来,在网络软件的支持下,实现彼此之间资源共享和数据通信的整个系统。

按照地理范围主要将网络分为局域网、城域网、广域网和因特网。

  • 局域网(LocalArea Network)简称 LAN,是一种在小范围内实现的计算机网络,一般在一个建筑物内或者一个工厂、一个事业单位内部独有,范围较小。
  • 城域网(Metropolitan Area Network)简称为 MAN,一般是一个城市内部组建的计算机信息网络,提供全市的信息服务。
  • 广域网(Wide Area Network)简称为 WAN,它的范围很广,可以分布在一个省、一个国家或者几个国家。
  • 因特网(Internet)则是由无数的 LAN 和 WAN 组成的。

网络编程模型

Client/Server 模式

这是客户机、服务器以及网络三者之间的关系图,使用这种模式的程序很多,例如很多读者喜欢玩的网络游戏,需要在本机上安装一个客户端,服务器运行在游戏开发公司的机房。

C/S模型

C/S模型使用 C/S 模式的程序,在开发时需要分别针对客户端和服务器端进行专门开发。这种开发模式的优势在于由于客户端是专门开发的,表现力会更强。缺点就是通用性差,也就是说一种程序的客户端只能和对应的服务器端进行通信,不能和其他的服务器端进行通信,在实际维护中,也需要维护专门的客户端和服务器端,维护的压力较大。

Browser/Server 模式

对于很多程序,运行时不需要专门的客户端,而是使用通用的客户端,例如使用浏览器。用户使用浏览器作为客户端的这种模式叫作浏览器/服务器模式。使用这种模式开发程序时只需开发服务器端即可,开发的压力较小,不需要维护客户端。但是对浏览器的限制比较大,表现力不强。

网络协议

网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。目前的网络协议有很多种,在这里简单介绍几种常用的网络协议。

IP 协议

IP 是英文 Internet Protocol(网络之间互联的协议)的缩写,中文简称为网协,也就是为计算机网络相互连接进行通信而设计的协议。在 Internet 中它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在 Internet 上进行通信时应当遵守的规则。任何厂家生产的计算机系统只有遵守 IP 协议才可以与 Internet 互联。

Internet 网络中采用的协议是 TCP/IP 协议,其全称是 Transmission Control Protocol/Internet Protocol。Internet 依靠 TCP/IP 协议在全球范围内实现不同硬件结构、不同操作系统、不同网络的互联。

对网络编程来说,主要是计算机和计算机之间的通信,首要的问题就是如何找到网络上数以亿计的计算机。为了解决这个问题,网络中的每个设备都会有唯一的数字标识,也就是 IP 地址。

在计算机网络中,现在命名 IP 地址的规定是 IPv4 协议,该协议规定每个 IP 地址由 4 个 0~255 的数字组成。

每台接入网络的计算机都拥有一个唯一的 IP 地址,这个地址可能是固定的,也可能是动态的。

目前 IETF(Internet Engineering Task Force,互联网工程任务组)设计的用于替代现行版本 IP 协议(IPv4)的下一代协议 IPv6,釆用 6 字节来表示 IP 地址,但目前还没有开始使用。

TCP/IP 定义了电子设备如何连入 Internet 以及数据如何在它们之间传输的标准。

协议采用 4 层的层级结构,分别是应用层、传输层、网络层和网络接口层。

每一层都呼叫它的下一层所提供的网络来完成自己的需求。

TCP 负责发现传输的问题,一有问题就发出信号要求重新传输,直到所有数据安全正确地传输到目的地,而 IP 是给 Internet 的每一台电脑规定一个地址。图 2 是 TCP/IP 层次结构图。

图2 TCP/IP层次结构

TCP 与 UDP 协议

尽管 TCP/IP 协议从名称看只包括 TCP 这个协议名,但是在 TCP/IP 协议的传输层同时存在 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)两个协议。

在网络通信中 TCP 协议类似于使用手机打电话,可以保证把信息传递给别人;而 UDP 协议类似于发短信,接收人有可能接收不到传递的信息。

在网络通信中使用 TCP 的方式需要建立专门的虚拟连接,然后进行可靠的数据连接,如果数据发送失败,客户端会自动重发该数据。而使用 UDP 方式不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

TCP 协议是一种以固定连线为基础的协议,它提供两台计算机之间可靠的数据传送。而 UDP 无连接通信协议,它不保证可靠数据的传输,但能够向若干目标发送数据以及接收来自若干源的数据。

对于一些重要的数据,一般使用 TCP 方式来进行数据传输,而大量的非核心数据则通过 UDP 方式进行传递。使用 TCP 方式传递的速度稍微慢一点,而且传输时产生的数据量会比 UDP 大一点。

套接字和端口

在网络上很多应用程序都是采用客户端/服务器(C/S)的模式,实现网络通信必须将两台计算机连接起来建立一个双向的通信链路,这个双向通信链路的每一端称之为一个套接字(Socket)。

一台服务器上可能提供多种服务,使用 IP 地址只能唯一定位到某一台计算机,却不能准确地连接到想要连接的服务器。通常使用一个 0~65535 的整数来标识该机器上的某个服务,这个整数就是端口号(Port)。端口号并不是指计算机上实际存在的物理位置,而是一种软件上的抽象。

端口号主要分为以下两类:

  1. 由 Internet 名字和号码指派公司 ICANN 分配绐一些常用的应用层程序固定使用的熟知端口,其值是 0~1023。例如 HTTP 服务一般使用 80 端口,FTP 服务使用 21 端口。
  2. 一般端口用来随时分配绐请求通信的客户进程。

运行在一台特定机器上的某个服务器(如 FTP 服务器)都有一个套接字绑定在该服务器上,服务器只是等待和监听客户的连接请求。客户端客户需要知道服务器的主机名和端口号。

为了建立连接请求,客户机试图与服务器上指定端口号上的服务进行连接,这个请求过程如图 3 所示。

客户向服务器发送请求
图3 客户向服务器发送请求

如果服务器接收到客户端的请求,就会创建一个套接字,客户端使用该套接字与服务器通信,但此时客户端的套接字并没有绑定到与服务器连接的端口号上。

URL 类

URL 概念

URL 是统一资源定位符(Uniform Resource Locator)的简称,它表示 Internet 上某一资源的地址。通过 URL 用户可以访问各种网络资源,比如常见的 WWW 以及 FTP 站点。浏览器可以通过解析给定的 URL 在网络上查找相应的文件或其他资源。

URL 是统一资源定位符(Uniform Resource Locator)的简称,它表示 Internet 上某一资源的地址。通过 URL 用户可以访问各种网络资源,比如常见的 WWW 以及 FTP 站点。浏览器可以通过解析给定的 URL 在网络上查找相应的文件或其他资源。

URL 的语法格式如下所示。

protocol://resourceName

协议名(protocol)指明获取资源所使用的传输协议,如 HTTP、FTP 和 file 等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。

下面是一些简单的 URL 示例。

http://www.sun.com/    协议名://主机名
http://localhost:8080/Test/admin/login.jsp 协议名://机器名:端口号/文件名

URL 类

在 java.net 包中包含专门用来处理 URL 的类 URL,可以获得 URL 的相关信息,例如 URL 的协议名和主机名等。下面分别对它的构造方法和常用方法进行介绍。

URL 的构造方法如表 1 所示。

构造方法说明
public URL (String spec)通过一个表示 URL 地址的字符串可以构造一个 URL 对象。
public URL(URL context,String spec)使用基本地址和相对 URL 构造一个 URL 对象。
public URL(String protocol,String host,String file)使用指定的协议、主机名和文件名创建一个 URL 对象。
public URL(String protocol,String host,int port,String file)使用指定的协议、主机名、端口号和文件名创建一个 URL 对象。

URL 的常用方法如表 2 所示。

方法说明
public String getProtocol()获取该 URL 的协议名。
public String getHost()获取该 URL 的主机名。
public int getPort()获取该 URL 的端口号,如果没有设置端口,返回 -1。
public String getFile()获取该 URL 的文件名。
public String getRef()获取该 URL 在文件中的相对位置。
public String getQuery()获取该 URL 的查询信息。
public String getPath()获取该 URL 的路径。
public String getAuthority()获取该 URL 的权限信息。
public String getUserInfo()获得使用者的信息。
public String getRef()获得该 URL 的锚点。

URLConnection 类

完成了 URL 的定义,接下来就可以获得 URL 的通信连接。在 java.net 包中,定义了专门的 URLConnection 类来表示与 URL 建立的通信连接,URLConnection 类的对象使用 URL 类的 openConnection() 方法获得。

URLConnection 类的主要方法如表 3 所示。

方法说明
void addRequestProperty(String key,String value)添加由键值对指定的一般请求属性。key 指的是用于识别请求的关键字 (例如 accept),value 指的是与该键关联的值。
void connect()打开到此 URL 所引用的资源的通信链接(如果尚未建立这样的链接)。
Object getConnection()检索此 URL 链接的内容。
InputStream getInputStream()返回从此打开的链接读取的输入流。
OutputStream getOutputStream()返回写入到此链接的输出流。
URL getURL()返回此 URLConnection 的 URL 字段的值。
例 1

使用 URL 和 URLConnection 类获取与百度首页的链接并将其页面信息输出到控制台,主要步骤如下所示。

(1) 创建一个类,编写 main() 方法,在该方法中创建一个 URL 对象,然后传入参数“http://www.baidu.com/”,输出 URL 的相关信息,代码如下所示。

package ch16;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class URLDemo
{
    public static void main(String[] args)
    {
        try
        {
            URL url=new URL("http://www.baidu.com/");
            System.out.println("协议:" + url.getProtocol());
            System.out.println("主机:" + url.getHost());
            System.out.println("端口:" + url.getPort());
            InputStream in;
        }
        catch(IOException e)
        {
            //TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
}

(2) 在 main() 方法的 try 模块中继续添加代码,获得 URLConnection 对象,通过输入流读取页面源代码并将信息输出到控制台,代码如下所示。

URLConnection uc=url.openConnection();
in=uc.getInputStream();
byte[] b=new byte[1024];
int len;
while((len=in.read(b))!=-1)
{
    System.out.println(new String(b,0,len));
}
in.close();

(3) 运行程序,执行结果如下所示。

协议:http
主机:www.baidu.com
端口:-1
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/......<img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
例2:读取URL中的资源

URL调用InputStream openStream() 方法可以返回一个输入流,该输入流值向URL对象包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端

Example2.java

public class Example2 {
   public static void main(String args[]) {
      WindowURL win=new WindowURL();
      win.setTitle("读取URL中的资源");
   }
}

WindowURL.java

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
public class WindowURL extends JFrame implements ActionListener,Runnable {
   JButton button;
   URL url;
   JTextField text;
   JEditorPane editPane; 
   byte b[]=new byte[118];
   Thread thread;
   public WindowURL() {
      text=new JTextField(20);
      editPane=new JEditorPane();
      editPane.setEditable(false);
      button=new JButton("确定");
      button.addActionListener(this);
      thread=new Thread(this);
      JPanel p=new JPanel();
      p.add(new JLabel("输入网址:"));
      p.add(text); 
      p.add(button);
      JScrollPane scroll=new  JScrollPane(editPane);
      add(scroll,BorderLayout.CENTER);
      add(p,BorderLayout.NORTH);
      setBounds(160,60,420,300);
      setVisible(true);
      validate();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
   public void actionPerformed(ActionEvent e) {
      if(!(thread.isAlive())) 
         thread=new Thread(this);
      try{ thread.start();
      }
      catch(Exception ee) {
          text.setText("我正在读取"+url);
      }
   }
   public void run() {
      try { int n=-1;
            editPane.setText(null);
            url=new URL(text.getText().trim());
            editPane.setPage(url);
      }
      catch(Exception e1) {
            text.setText(""+e1);
            return;
      }
   }
}
例3 显示URL资源中的HTML文件

Javax.swing包中的JEditorPane容器可以解释、执行HTML文件

Example3.java

package try01;

public class Example3 {
	public static void main(String args[]) {
	      WindowHTML win=new WindowHTML();
	      win.setTitle("显示网页");
}

WindowHTML.java

package try01;

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
public class WindowHTML extends JFrame implements ActionListener,Runnable {
   JButton button;
   URL url;
   JTextField text;
   JEditorPane editPane; 
   byte b[]=new byte[118];
   Thread thread;
   public WindowHTML() {
      text=new JTextField(20);
      editPane=new JEditorPane();
      editPane.setEditable(false);
      button=new JButton("确定");
      button.addActionListener(this);
      thread=new Thread(this);
      JPanel p=new JPanel();
      p.add(new JLabel("输入网址:"));
      p.add(text); 
      p.add(button);
      JScrollPane scroll=new  JScrollPane(editPane);
      add(scroll,BorderLayout.CENTER);
      add(p,BorderLayout.NORTH);
      setBounds(160,60,420,300);
      setVisible(true);
      validate();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
   public void actionPerformed(ActionEvent e) {
      if(!(thread.isAlive())) 
         thread=new Thread(this);
      try{ thread.start();
      }
      catch(Exception ee) {
          text.setText("我正在读取"+url);
      }
   }
   public void run() {
      try { int n=-1;
            editPane.setText(null);
            url=new URL(text.getText().trim());
            editPane.setPage(url);
      }
      catch(Exception e1) {
            text.setText(""+e1);
            return;
      }
   }
}

InetAddress类

Internet 上的主机有两种方式表示地址,分别为域名IP 地址。java.net 包中的 InetAddress 类对象包含一个 Internet 主机地址的域名和 IP 地址。

==InetAddress 类提供了操作 IP 地址的各种方法。==该类本身没有构造方法,而是通过调用相关静态方法获取实例。

常用方法如下表 所示。

方法名称说明
boolean equals(Object obj)将此对象与指定对象比较
byte[] getAddress()返回此 InetAddress 对象的原始 IP 地址
static InetAddress[] getAHByName(String host)在给定主机名的情况下,根据系统上配置的名称,服务器返 回其 IP 地址所组成的数组
static InetAddress getByAddress(byte[] addr)在给定原始 IP 地址的情况下,返回 InetAddress 对象
static InetAddress getByAddress(String host)在给定主机名的情况下确定主机的 IP 地址
String getCanonicalHostName()获取此 IP 地址的完全限定域名
String getHostAddress()返回 IP 地址字符串(以文本表现形式)
String getHostName()返回此 IP 地址的主机名
static InetAdderss getLocalHost()返回本地主机

例 1

编写程序练习 InetAddress 类的基本使用方法,主要步骤如下所示。

package try01;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Try01 {
	public static void main(String[] args)
	{       
	    try
	    {
	    	//(1) 创建一个 InetAddress 对象,调用 getByName() 方法并传递参数“www.qqxom”输出此对象的 IP 地址字符串和主机名、
	        InetAddress ia1=InetAddress.getByName("www.qq.com");
	        System.out.println(ia1.getHostName());
	        System.out.println(ia1.getHostAddress());
	        
	        //(2) 创建一个 InetAddress 对象,调用 getByName() 方法并传递参数“61.135.169.105”输出此对象的 IP 地址字符串和主机名、
	        InetAddress ia2=InetAddress.getByName("61.135.169.105");
	        System.out.println(ia2.getHostName());
	        System.out.println(ia2.getHostAddress());
	        
	        //(3) 创建一个 InetAddress 对象用于获取本地主机的信息,输出此对象的 IP 地址字符串和主机名、
	        InetAddress ia3=InetAddress.getLocalHost();
	        System.out.println("主机名:"+ia3.getHostName());
	        System.out.println("本地ip地址:"+ia3.getHostAddress());
	    }
	    catch(UnknownHostException e)
	    {
	        e.printStackTrace();
	    }       
	}	
}

执行程序,运行结果如下所示。

www.qq.com
183.192.170.139
61.135.169.105
61.135.169.105
主机名:DESKTOP-*******
本地ip地址:***.***.*.***

注意:在上述代码中包含互联网的地址,所以运行时需要连网,否则会出现异常。

Java TCP通信

http://c.biancheng.net/view/1199.html

TCP 网络程序是指利用 Socket 编写的通信程序。利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个是服务器程序,一个是客户端程序,两者的功能和编写方法不太一样。其中 ServerSocket 类表示 Socket 服务器,Socket 类表示 Socket 客户端,两者之间的交互过程如下:

  1. 服务器端创建一个 ServerSocket(服务器端套接字),调用 accept() 方法等待客户端来连接。
  2. 客户端程序创建一个 Socket,请求与服务器建立连接。
  3. 服务器接收客户的连接请求,同时创建一个新的 Socket 与客户建立连接,服务器继续等待新的请求。

ServerSocket类

ServerSocket 类是与 Socket 类相对应的用于表示通信双方中的服务器端,用于在服务器上开一个端口,被动地等待数据(使用 accept() 方法)并建立连接进行数据交互。

服务器套接字一次可以与一个套接字连接,如果多台客户端同时提出连接请求,服务器套接字会将请求连接的客户端存入队列中,然后从中取出一个套接字与服务器新建的套接字连接起来。若请求连接大于最大容纳数,则多出的连接请求被拒绝;默认的队列大小是 50。

下面简单介绍一下 ServerSocket 的构造方法和常用方法。

ServerSocket 的构造方法

ServerSocket 的构造方法如下所示。

  • ServerSocket():无参构造方法。
  • ServerSocket(int port):创建绑定到特定端口的服务器套接字。
  • ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
  • ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。

在上述方法的参数中 port 指的是本地 TCP 端口,backlog 指的是监听 backlog,bindAddr 指的是要将服务器绑定到的 InetAddress。

创建 ServerSocket 时可能会拋出 IOException 异常,所以要进行异常捕捉。如下所示为使用 8111 端口的 ServerSocket 实例代码。

try
{
    ServerSocket serverSocket=new ServerSocket(8111);
}
catch(IOException e)
{
    e.printStackTrace();
}
ServerSocket 的常用方法

ServerSocket 的常用方法如下所示。

  • Server accept():监听并接收到此套接字的连接。
  • void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。
  • void close():关闭此套接字。
  • InetAddress getInetAddress():返回此服务器套接字的本地地址。
  • int getLocalPort():返回此套接字监听的端口。
  • SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。
  • int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从 ServerSocket 接收的套接字的建议缓冲区大小。

调用 accept() 方法会返回一个和客户端 Socket 对象相连接的 Socket 对象,

服务器端的 Socket 对象使用 getOutputStream() 方法获得的输出流将指定客户端 Socket 对象使用 getInputStream() 方法获得那个输入流。同样,服务器端的 Socket 对象使用的 getInputStream() 方法获得的输入流将指向客户端 Socket 对象使用的 getOutputStream() 方法获得的那个输出流。

也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之同样如此。

例 1

了解上面的基础知识后,下面使用 ServerSocket 类在本机上创建一个使用端口 8888 的服务器端套接字,实例代码如下所示。

package try01;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocket_ {
	@SuppressWarnings("resource")
	public static void main(String[] args)
	{
	    try
	    {
	        //在8888端口创建一个服务器端套接字
	        ServerSocket serverSocket=new ServerSocket(8888);
	        System.out.println("服务器端Socket创建成功");
	        while(true)
	        {
	            System.out.println("等待客户端的连接请求");
	            //等待客户端的连接请求
	            Socket socket=serverSocket.accept();
	            System.out.println("成功建立与客户端的连接");
	        }
	    }
	    catch(IOException e)
	    {
	        e.printStackTrace();
	    }
	}
}
服务器端Socket创建成功
等待客户端的连接请求

Socket 类

Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据)。

下面简单介绍一下 Socket 类的构造方法和常用方法。

Socket 的构造方法

Socket 的构造方法如下所示。

  • Socket():无参构造方法。
  • Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口。
  • Soclcet(InetAddress address,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。
  • Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口。
  • Socket(String host,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。

在上述方法的参数中,address 指的是远程地址,port 指的是远程端口,localAddr 指的是要将套接字绑定到的本地地址,localPort 指的是要将套接字绑定到的本地端口。

Socket 的常用方法

Socket 的常用方法如下所示。

  • void bind(SocketAddress bindpoint):将套接字绑定到本地地址。
  • void close():关闭此套接字。
  • void connect(SocketAddress endpoint):将此套接字连接到服务器。
  • InetAddress getInetAddress():返回套接字的连接地址。
  • InetAddress getLocalAddress():获取套接字绑定的本地地址。
  • InputStream getInputStream():返回此套接字的输入流。
  • OutputStream getOutputStream():返回此套接字的输出流。
  • SocketAddress getLocalSocketAddress():返回此套接字绑定的端点地址,如果尚未绑定则返回 null。
  • SocketAddress getRemoteSocketAddress():返回此套接字的连接的端点地址,如果尚未连接则返回 null。
  • int getLoacalPort():返回此套接字绑定的本地端口。
  • intgetPort():返回此套接字连接的远程端口。

例 2

编写 TCP 程序,包括一个客户端和一个服务器端。要求服务器端等待接收客户端发送的内容,然后将接收到的内容输出到控制台并做出反馈。

package try01;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Socket_ {
	public static void main(String[] args) throws IOException, InterruptedException
	{
		//(1) 创建一个类作为客户端,首先在 main() 方法中定义一个 Socket 对象、一个 OutputStream 对象和一个 InputStream 对象并完成初始化。接着定义服务器端的 IP 地址和端口号
	    Socket socket=null;
	    OutputStream out=null;
	    InputStream in=null;
	    String serverIP="192.168.1.110";    //服务器端 IP 地址
	    int port=5000;    //服务器端端口号
	    
	    //(2) 建立与服务器端的连接并将数据发送到服务器端
	    socket=new Socket(serverIP,port);    //建立连接
	    out=socket.getOutputStream();    //发送数据
	    out.write("我是客户端数据 ".getBytes());
	    Thread.sleep(1000);
	    
	    //(3) 从输入流中读出服务器的反馈信息并输出到控制台
	    byte[] b=new byte[1024];
	    in=socket.getInputStream();
	    int len=in.read(b);
	    System.out.println(" 服务器端的反馈为:"+new String(b,0,len));
	    
	    //(4) 关闭输入/输出流以及 Socket 对象
	    in.close();
	    out.close();
	    socket.close();
	    
	    //(5) 创建一个类作为服务器端,编写 main() 方法,创建 ServerSocket、Socket、InputStream、OutputStream 以及端口号并初始化
	    ServerSocket ServerSocket=null;
	    Socket socket1=null;
	    InputStream in1=null;
	    OutputStream out1=null;
	    int port1=5000;
	    
	    //(6) 开启服务器并接收客户端发送的数据
	    ServerSocket=new ServerSocket(port1);    //创建服务器套接字
	    System.out.println("服务器开启,等待连接。。。");
	    socket1=ServerSocket.accept();    //获得连接
	    //接收客户端发送的内容
	    in1=socket1.getInputStream();
	    byte[] b1=new byte[1024];
	    int len1=in1.read(b1);
	    System.out.println("客户端发送的内容为:"+new String(b1,0,len1));
	    
	    //(7) 使用输出流对象将信息反馈给客户端
	    out1=socket1.getOutputStream();
	    out1.write("我是服务器端".getBytes());
	    
	    //(8) 关闭输入/输出流、Socket 对象以及 ServerSocket 对象
	    in1.close();
	    out1.close();
	    ServerSocket.close();
	    socket1.close();
	    
	    //(9) 运行服务器端程序代码

	}
}

客户端与服务端的简单通信

package try01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketDome
{
    public static void main(String[] args)
    {
        Socket socket=null;
        PrintWriter out=null;
        BufferedReader in=null;
        String serverIP="192.168.1.110";    //服务器端ip地址
        int port=5000;    //服务器端端口号
        try
        {
            socket=new Socket(serverIP,port);
            in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out=new PrintWriter(socket.getOutputStream(),true);
            while(true)
            {
                int number=(int)(Math.random()*10)+1;
                System.out.println("客户端正在发送的内容为:"+number);
                out.println(number);
                Thread.sleep(2000);
            }
        }
        catch(IOException | InterruptedException e)
        {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java网络编程是一种通过使用Java编程语言,在计算机网络上实现通信的技术。它涉及到协议、IP地址和端口号等三个重要要素。Java编写的应用程序可以在单个计算机上运行,也可以在网络的服务器端和客户端上分布运行。此外,Java还可以用于编写小型应用程序模块或applet,作为网页的一部分使用。applet可以嵌入网页中,并在浏览器中运行。在Java中,使用URI可以代表绝对的或相对的资源,而URL则包含了定位资源的信息,并且不能是相对的。Java提供了一系列的类和接口,例如InetAddress、Socket、ServerSocket、URL和URLConnection等,用于实现各种网络应用。通过使用这些类和接口,可以创建连接客户端和服务器之间的套接字,并实现面向连接的通信,保证数据的可靠传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java网络编程](https://blog.csdn.net/weixin_42784609/article/details/130388655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [超详细入门到精通自学视频课程(阶段01:JavaSE基础02 编程思维编程思维和编程能力、综合应用专题-04、案例...](https://download.csdn.net/download/weixin_54787054/88224199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [网络编程](https://blog.csdn.net/zhixingwu/article/details/103226003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值