java实现最基础的socket网络通信
时间:2022-04-26
本文章向大家介绍java实现最基础的socket网络通信,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、网络通信基础
网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址。
而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分。
二、java中的基本网络支持
1、IP地址使用InetAddress类来表示。
获取InetAddress实例的两个方法为:
(1)getByName(String host) 根据主机获取对应的InetAddress对象
(2)getByAddress(byte[] addr)根据IP地址获取InetAddress对象
2、InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名
(1)String getCanonicalHostName()获取此IP地址的权限定域名
(2)String getHostAddress()获取InetAddress实例对应的IP地址
(3)String getHostName()获取此IP地址的主机名
此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否可以到达该地址。
三、java实现简单的TCP/IP通信
服务器端使用ServerSocket创建TCP服务器,使用accept()进行监听,如果接收到客户端请求则返回一个与客户端对应的Socket,否则处于等待状态。
客户端根据服务器的IP,连接服务器。
服务器代码:
import java.net.*;
import java.io.*;
/**
手机端代码
手机端作为服务器,获取自己的ip地址,并显示以供客户端连接
*/
public class phone_Server
{
public static void main(String[] args)
throws IOException
{
//打印本机的IP地址
InetAddress address=InetAddress.getLocalHost();
System.out.println("本机的IP地址是"+address.getHostAddress());
// 创建一个ServerSocket,用于监听客户端Socket的连接请求
ServerSocket ss = new ServerSocket(30000);
// 采用循环不断接受来自客户端的请求
while (true)
{
// 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
Socket s = ss.accept();
// 将Socket对应的输出流包装成PrintStream
PrintStream ps = new PrintStream(s.getOutputStream());
// 进行普通IO操作
ps.println("您好,您收到了服务器的新年祝福!");
// 关闭输出流,关闭Socket
ps.close();
s.close();
}
}
}
客户端代码:
/**
PC端代码
PC作为客户端,根据服务器的IP地址和端口号连接服务器
*/
import java.net.*;
import java.io.*;
public class PC_Client
{
public static void main(String[] args)
throws IOException
{
//Socket socket = new Socket("127.0.0.1" , 30000);
Socket socket = new Socket("192.168.47.1" , 30000);//这里的IP地址填写手机端服务器的IP地址
// 将Socket对应的输入流包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 进行普通IO操作
String line = br.readLine();
System.out.println("来自服务器的数据:" + line);
// 关闭输入流、socket
br.close();
socket.close();
}
}
补充一点socket传输大数据的内容
由于socket单次传输的数量是有一定的限制的,所以应该分批次传输和接受
可以写成这样:
传输
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
int start=0;
while((start+1024)<data.length)
{
out.write(data, start,1024);
start=start+1024;
}
if(start<data.length)
{
out.write(data, start,(data.length-start+1));
}
//String str = new String(data);
//out.writeUTF(str);
}catch (Exception e) {
Log.d(TAG, "文件传输异常");
}
接受
DataInputStream input = new DataInputStream(socket.getInputStream());
byte []buf=new byte[1024];
int readnum=0;
while(true)
{
readnum=input.read(buf);
if(readnum>0)
{
System.out.println(Arrays.toString(buf));
while((readnum=input.read(buf))>0)
{
System.out.println(Arrays.toString(buf));
}
}
}
- AVFoundation 框架初探究(三)
- AVFoundation 框架初探究(二)
- 关于视图和存储过程的权限问题探究 (r9笔记第87天)
- Java基础-day08-超市购物系统总结
- AVFoundation 框架初探究(一)
- 【Go 语言社区】 HTML5 前端--数据保存实例
- crontab设置导致的服务器进程异常问题 (r10笔记第4天)
- 一条SQL语句的执行计划变化探究(r10笔记第3天)
- tensorflow(一)windows 10 python3.6安装tensorflow1.4与基本概念解读
- 基于AgileEAS.NET SOA 中间件领域模型数据器快速打造自己的代码生成器
- Java基础-day07-代码题-自定义数据类型;ArrayList集合
- 一条报警信息的快速处理和分析(r9笔记第99天)
- 【Go 语言社区】解析Go语言编程中的struct结构
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 数学--数论--Alice and Bob (CodeForces - 346A )推导
- ACM-ICPC 2019 山东省省赛 M Sekiro
- 数学--数论--HDU2136 Largest prime factor 线性筛法变形
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
- ACM-ICPC 2019 山东省省赛 A Calandar
- POJ 1845-Sumdiv(厉害了这个题)
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
- DP背包(一)
- 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!
- ZOJ 3623 Battle Ships
- POJ 2955 区间DP必看的括号匹配问题,经典例题
- POJ 3211 Washing Clothes
- 1745 Divisibility
- POJ 3616 Milking Time