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));
}
}
}
java实现最基础的socket网络通信的更多相关文章
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- Java网络编程基础(Netty预备知识)
今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...
- Java与C之间的socket通信
最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...
- Java 过一下基础
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- Socket网络通信之NIO
Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...
- Socket网络通信之BIO
Socket网络通信之BIO 如果要让两台计算机实现通信,需要的条件:ip,port,协议. 目前我们用的最多的就是TCP/IP协议和UDP协议.TCP三次握手,所以比较慢,且安全:UDP速度快,但是 ...
- Python 基础之socket编程(一)
Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...
随机推荐
- 在Web API中使用Swagger-UI开源组件(一个深坑的解决)
介绍: Swagger-Ui是一个非常棒的Web API说明帮助页,具体详情可自行Google和百度. 官网:http://swagger.io/ GitHub地址:https://github ...
- c++类中的静态成员
静态成员和非静态成员的区别: 类静态成员用static修饰,类的静态成员属于类本身,而不属于类的某个具体对象,静态成员被类的所有对象共享,因此某个对象对静态成员(数据成员)的修改对其对象是可见的.而类 ...
- SSMS 2008R2没有智能感知方法解决
有时SSMS会莫明奇妙的没有了智能感知(前一天还是有的, 第2天就没有了) 在网上查到有如下原因: 1. 服务器上有Offline的DB 解决方案: 将Offline的DB删掉或者设成online即可 ...
- error:LNK2005 已经在*.obj中定义
为什么会出现这个错误??“error LNK2005: 已经在*.obj中定义” 编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原 ...
- iOS 10的23个隐藏新特性-b
上周iOS 10正式版推送后,24小时的更新率已经超过15%,实在惊人.虽然有着初期变砖.5S6卡顿.移动VoLTE无法使用.美版无信号等BUG,但不可忽视的是,iOS 10还是带来了很多从前没有的功 ...
- Sql例子Sp_ExecuteSql 带参数
Declare @i int, @projectCount int ) --参数 ) ) ) ) ) ) --循环变量起始 --得到所有的项目 select @projectCount = count ...
- SQL SERVER字符串函数
本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER的字符串函数. 其实数据库跟程序语言库一样,都会集成很多可以使用的API.这些API,如果你熟悉的话,将 ...
- javascript数学计算
◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数:◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数:◎Math.round()执行标准舍入,即它总 ...
- 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态
以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根 ...
- 仪表盘 hostmap 新玩法让运维工作越玩越 high
Cloud Insight 第13次新品发布会现在开始,首先非常感谢大家前来看我们的新功能发布会,下面我先给大家介绍一下新功能,之后有什么问题大家尽管问