IP地址和端口号

端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用,

用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。

InetAddress

常用方法

代码演示:

public static void main(String[] args) throws UnknownHostException {
//InetAddress inet=InetAddress.getLocalHost();
//主机名+ip地址
InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34");
System.out.println(inet);
String host=inet.getHostName();
String ip=inet.getHostAddress();
System.out.println(host+"..."+ip);
}

UDP通信

DatagramPacket

DatagramSocket

UDP网络程序

代码演示:

//发送端
public class UDPSend {
public static void main(String[] args) throws IOException {
//1.打包
//明确数据
byte[] bytes="你好吗".getBytes();
//明确目的地的IP地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
//装包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888);
//2.创建快递公司
DatagramSocket ds=new DatagramSocket();
//3.发送
ds.send(dp);
//4.释放资源
ds.close();
} }
//接收端
public class UDPReceive {
public static void main(String[] args) throws IOException {
//明确端口号
DatagramSocket ds=new DatagramSocket(8888);
//创建接收数据的字节数组
byte[] bytes=new byte[1024];
//创建接收的数据包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//接收
ds.receive(dp);
//获取接收包上的数据
int length=dp.getLength();
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,length));
//释放资源
ds.close();
} }

TCP通信

一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

ServerSocket

Socket

方法声明

功能描述

int getPort()

该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号

InetAddress getLocalAddress()

该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回

void close()

该方法用于关闭Socket连接,结束本次通信。在关闭socket之前,应将与socket相关的所有的输入/输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源

InputStream getInputStream()

该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据

OutputStream getOutputStream()

该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据

图解:

代码演示:

//发送端
public class UDPSend {
public static void main(String[] args) throws IOException {
//1.打包
//明确数据
Scanner sc=new Scanner(System.in);
//明确目的地的IP地址
InetAddress inet=InetAddress.getByName("192.168.1.171");
//2.创建快递公司
DatagramSocket ds=new DatagramSocket();
while(true){
String mes=sc.next();
byte[] bytes=mes.getBytes();
//装包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666);
//3.发送
ds.send(dp);
}
//4.释放资源
//ds.close(); }
//接收端
public class UDPReceive {
public static void main(String[] args) throws IOException {
//明确端口号
DatagramSocket ds=new DatagramSocket(8888);
//创建接收数据的字节数组
byte[] bytes=new byte[1024];
//创建接收的数据包
while(true){
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//接收
ds.receive(dp);
//获取接收包上的数据
int length=dp.getLength();//明确发送的字节长度
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"
+new String(bytes,0,length));
}
}
//服务器端
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建服务器套接字
ServerSocket server=new ServerSocket(7777);
//调用accept方法与客户端创建链接
Socket socket=server.accept();
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//服务器给客户端回复
OutputStream out=socket.getOutputStream();
out.write("收到!over!".getBytes()); server.close();
}
//客户端
public class TCPCLient {
public static void main(String[] args) throws IOException {
//1.创建Socket对象,连接服务器
Socket socket=new Socket("127.0.0.1",7777);
//2.通过客户端套接字对象Socket对象中的获取字节输出流的方法
OutputStream out=socket.getOutputStream();
//3.将数据写向服务器
out.write("服务器你好".getBytes());
//接收服务器端的回复
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println(new String(bytes, 0, len));
//释放资源
socket.close();
}

文件上传案例

代码演示:

public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(5555);
Socket socket=server.accept();
//明确数据源
InputStream in=socket.getInputStream();
//明确目的地
File file=new File("x:\\upload");
if(!file.exists()){
file.mkdirs();
}
//域名+毫秒值
String filename="oracle"+System.currentTimeMillis()+".jpg";
FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
//复制
int len=0;
byte[] bytes=new byte[1024];
while((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
} //回复客户端
OutputStream out=socket.getOutputStream();
out.write("上传成功!".getBytes());
//释放资源
server.close();
fos.close();
}
}
public class TCPClinet {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.1.171",7000);
OutputStream out=socket.getOutputStream();
//明确数据源
FileInputStream fis=new FileInputStream("x:\\test\\img1.jpg");
int len=0;
byte[] bytes=new byte[1024];
//文件复制
while((len=fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
//告诉服务器端不要在读了到末尾了
socket.shutdownOutput();
//服务器端回复
InputStream in=socket.getInputStream();
len=in.read(bytes);
System.out.println(new String(bytes, 0, len));
//释放资源
fis.close();
socket.close();
} }

文件上传案例多线程版本

代码演示:

public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(6000);
while(true){
Socket socket=server.accept();
new Thread(new Upload(socket)).start();
}
}
}
public class Upload implements Runnable{
private Socket socket;
public Upload(Socket socket){
this.socket=socket;
}
public void run() {
//明确数据源
FileOutputStream fos=null;
try {
InputStream in= socket.getInputStream();
//明确目的地
File file=new File("x:\\upload");
if(!file.exists()){
file.mkdirs();
}
//域名+毫秒值
String filename="oracle"+System.currentTimeMillis()+".jpg";
fos=new FileOutputStream(file+File.separator+filename);
//复制
int len=0;
byte[] bytes=new byte[1024];
while((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//回复客户端
OutputStream out=socket.getOutputStream();
out.write("上传成功!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally{
//释放资源
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

TCP、UDP网络通信的更多相关文章

  1. Java中的TCP/UDP网络通信编程

    127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...

  2. Java TCP/UDP网络通信编程

    本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ...

  3. UC编程之网络通信(TCP/UDP)

    网络常识 OSI 7层模型(人机交互) 物理层.数据链路层.网络层.传输层.会话层.表现层.应用层 常见协议: tcp/udp/ip/ftp/http... IP地址--就是计算机在网络中的地址,是一 ...

  4. Java 网络通信(TCP/UDP)

    1.InetAdress类 与  Socket类  >InetAdress  >Socket 2.TCP/IP协议簇  客户端: 创建 Socket:根据指定服务端的 IP 地址或端口号构 ...

  5. 开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等

    开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等 C++开发网络通信程序时用asio是个不错的选择 ...

  6. HP-SOCKET TCP/UDP通信框架库解析

    项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...

  7. HTTP,FTP,TCP,UDP及SOCKET

    一.TCP/IP协议简析TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层:网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议传输层:TCP协议与UDP协议应用层:F ...

  8. SOCKET,TCP/UDP,HTTP,FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  9. [网络] SOCKET, TCP/UDP, HTTP, FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  10. TCP/UDP简介

    TCP/UDP简介 Socket小白篇-附加TCP/UDP简介 Socket 网络通信的要素 TCP和UDP Socket的通信流程图 1.Socket 什么是Socket Socket:又称作是套接 ...

随机推荐

  1. 关于控制反转(IOC)容器 ,依赖注入(DI)模式必读文章收集

    推荐一篇国外設計大師Martin Fowler的大作:Inversion of Control Containers and the Dependency Injection pattern http ...

  2. 如何查看mysql数据库表所使用的引擎(转载)

    我们怎么样才能准确的查看mysql的存储引擎呢,下面我给大家介绍两种正确的方式. 1)正确方式一: SHOW TABLE STATUS from 数据库库名 where Name='表名' 2)mys ...

  3. Django TypeError: isinstance() arg 2 must be a type or tuple of types

    报错: TypeError: isinstance() arg must be a type or tuple of types from django.db import modelsfrom dj ...

  4. XHR的对象及用法

    function  createXHR(){         //检测原生XHR对象是否存在,如果存在刚返回它的新实例:     //如果不存在,则检测ActiveX对象;     //如果两个都不存 ...

  5. Hadoop(一) HADOOP简介

    1. HADOOP背景介绍 1.1 什么是HADOOP HADOOP是apache旗下的一套开源软件平台 HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 H ...

  6. Unknown type name 'NSString' 解决方案

    今天看到个问题,编辑工程提示Unknown type name 'NSString',如下图 导致出现异常的原因是是因为工程中添加了ZipArchive(第三方开源解压缩库) 一般情况下出现“Unkn ...

  7. UIDataPicker 时间选择器

    自用时间选择器 @interface ViewController () { UILabel *cityLabel; UIDatePicker *datePicker; } //@property(n ...

  8. Nginx 如何限定IP访问

    在nginx.conf中的server限制段中.deny IP.表示需要限制该IP不可访问.allow IP表示权该IP可以访问. 如上图.表示阻止192.168.1.122的IP的访问.那当然也可以 ...

  9. 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中

    DIOCP Demo说明 下载地址 https://code.google.com/p/diocp/ 特地为DIOCP开设了一个群:320641073,欢迎学习的IOCP的童鞋进入讨论. 核心作者:  ...

  10. Trapping Rain Water LT42

    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of ...