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. devexpress WinForms MVVM

    WinForms MVVM This section is dedicated to the Model-View-ViewModel (MVVM) architectural pattern. Yo ...

  2. 20.Mysql锁机制

    20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写 ...

  3. (转)JavaScript escape() 函数(该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。)

    JavaScript escape() 函数 JavaScript 全局对象参考手册 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape ...

  4. 开源防火墙(pfSense)的安装部署与配置

    pfSense是一个基于FreeBSD架构的软件防火墙,通常会被安装在多网卡的主板上作为路由器或者防火墙去使用.往往这些硬件都比较廉价,高性能的配置也就1千元左右.pfSense具有商业防火墙的大部分 ...

  5. Startup.国外新锐公司及其技术Blog

    国外技术公司Tech/Engineering Blog 1. vimeo https://coderwall.com/team/vimeo http://blog.assembly.com/ 2. l ...

  6. javascript 高级程序设计 五

    1.变量: ECMAScript中的基本类型都是值类型Boolean,Number,Null,Undefined和String,在这里JS和其他的语言有所不同,就是JS中的String是值类型 而不像 ...

  7. POJ 2762 Going from u to v or from v to u?- Tarjan

    Description 判断一个有向图是否对于任意两点 $x$,  $y$ 都有一条路径使$x - >y$或 $y - >x$ Solution 对于一个强联通分量内的点 都是可以互相到达 ...

  8. php实现MySQL两库对比升级版

    define('DATABASE1', 'db1'); $dbi1 = new DbMysql; $dbi1->dbh = 'mysql://root:password@127.0.0.1/'. ...

  9. barcode(index)

    在很多情况下,我们需要把多个样本混合在一起,在同一个通道(lane)里完成测序.像转录组测序.miRNA测序.lncRNA测序.ChIP测序等等,通常每个样本所需要的数据量都比较少,远少于HiSeq一 ...

  10. PHP filter 函数FILTER_CALLBACK 过滤数据

    <?php function convertSpace($string) { return str_replace(" ", "_", $string); ...