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. Soa思想分布式服务webservice WCF

    什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这 ...

  2. Informatica_(3)组件

    一.Informatica介绍Informatica PowerCenter 是Informatica公司开发的世界级的企业数据集成平台,也是业界领先的ETL工具.Informatica PowerC ...

  3. Oracle触发器(trigger):一般用法

    trigger和procedure,function类似,只不过它不能被显示调用,只能被某个事件触发然后oracle自动去调用.常用的一般是针对一个表或视图创建一个trigger,然后对表或视图做某些 ...

  4. 使用Visual VM 查看linux中tomcat运行时JVM内存

    前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用.我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间 ...

  5. js的日期格式判断

    var reg = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/; var str = (new Date).toLocaleString() ...

  6. Codeforces 803C. Maximal GCD 二分

    C. Maximal GCD time limit per test: 1 second memory limit per test: 256 megabytes input: standard in ...

  7. Django 创建一个应用程序

    1. 认识Django Django是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计. 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需 ...

  8. 从hash算法到java hashcode()

    转载 https://blog.csdn.net/Walk_er/article/details/74976146 hash算法是一个摘要算法(yy:描述性算法:可以给一个物体确切的描述,但是不能通过 ...

  9. 64位ubuntu 兼容32位

    http://www.cnblogs.com/mliudong/p/4086797.html 首先要打开64位系统对32位的支持 第一步:确认64为架构的内核 dpkg --print-archite ...

  10. 【转】如何用Redis做LRU-Cache

    LRU(Least Recently Used)最近最少使用算法是众多置换算法中的一种. Redis中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小.Redis用到的LRU ...