Socket编程

通信基础:ip地址(位置)、协议(语言)、端口(软件程序);

java提供网络功能的四大类:

InetAddress没有构造函数,不够里面有一些方法是可以返回实例,如:

InetAddress.getLocalHost();返回本机的实例;

InetAddress.getByName(String NAME);根据主机名或ip返回实例;

URL类实例化后可以获取URL的主机名、端口、文件的路径、文件名等等信息,需要注意的是,如果URL在实例化时没有指定端口号,会传入默认端口号,通过url.getPort()获取的端口号是-1而不是80;

URL提供了一个openStream(),用来获取URL的输入流,例:

public void urlTest() throws IOException {
URL baidu = new URL("http://www.baidu.com");
InputStream in = baidu.openStream();//获取URL的输入流,此时输入流是字节数组
InputStreamReader isr = new InputStreamReader(in,"utf-8");//将输入流转换为字符输入流
BufferedReader br = new BufferedReader(isr);//为字符流添加缓冲
String data = br.readLine();
while(data!=null) {
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
in.close();
}

给予TCP协议实现网络通信的类:

客户端:Socket类

服务器端;ServerSocket类

Socket实现通信的步骤:

常用的创建构造方法及常用方法:

ServerSocket类:

构造方法:

ServerSocket(int port);指定端口号创建ServerSocket类;

调用方法:

accept();监听并接收此套接字的连接,返回一个Socket;

close();关闭套接字

getInetAddress(),返回InetAddress类,返回服务器的本地地址;

getLocalPort(),返回int类,返回套接字监听的接口;

Socket类:

构造方法:

Socket(String host,int port);指定主机地址和端口创建Socket类;

调用方法;

close();关闭套接字

getInetAddress(),返回InetAddress类,返回套接字的本地地址;

getLocalPort(),返回int类,返回套接字绑定的接口;

getInputStream(),返回InputStream类,获取套接字的输入流

getOutputStream(),返回OutputStream类,获取套接字的输出流

通过Socket编码演示实现服务器端和客户端之间的通讯:

服务器端:

package com.Socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(8889);//创建服务器套接字
System.out.println("===服务器即将启动,正在等待客户端的连接===");
Socket socket = serversocket.accept();//开始监听,等待客户端的连接
InputStream in = socket.getInputStream();//获取输入流
InputStreamReader inr = new InputStreamReader(in);//将字节输入流转为字符输入流
BufferedReader binr = new BufferedReader(inr);//将输入流添加到缓冲流
String info =null;
while((info = binr.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
OutputStream output = socket.getOutputStream();
PrintWriter pw = new PrintWriter(output);
pw.write("欢迎您");
pw.flush();
pw.close();
binr.close();
inr.close();in.close();
socket.close();
serversocket.close();
}
}

客户端:

package com.Socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",8889);//创建客户端Socket套接字
OutputStream output = socket.getOutputStream();//创建字节输出流
PrintWriter pw = new PrintWriter(output);//将输出流包装为打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info;
while((info = br.readLine())!=null) {
System.out.print("客户端对我说:"+info);
}
br.close();
in.close();
pw.close();
output.close();
socket.close();
} }

 多线程的通信:

建立一个线程类:

package com.Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
InputStream in = socket.getInputStream();//获取输入流
InputStreamReader inr = new InputStreamReader(in);//将字节输入流转为字符输入流
BufferedReader binr = new BufferedReader(inr);//将输入流添加到缓冲流
String info =null;
while((info = binr.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
OutputStream output = socket.getOutputStream();
PrintWriter pw = new PrintWriter(output);
pw.write("欢迎您");
pw.flush();
if(pw!=null)
pw.close();
if(binr!=null)
binr.close();
if(inr!=null)
inr.close();
if(in!=null)
in.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

在服务器类中循环调用accept()方法并不断实例化线程类,在accept()连接返回一个Socket后又继续调用进行监听:

package com.Socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; public class server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(8889);//创建服务器套接字
Socket socket = null;
int count = 0;
System.out.println("===服务器即将启动,正在等待客户端的连接===");
while(true) {
socket = serversocket.accept();
//开始监听,等待客户端的连接
ServerThread serverthread = new ServerThread(socket);
serverthread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address =socket.getInetAddress();
System.out.println("客户端的IP:"+address);
}
}
}

这样既可实现多客户端的多次连接;

 UDP信息传输

DatagramPacket:表示数据报包

DatagramSocket:表示端到端通信的类

服务器端:

package com.Socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class Udpserver {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8887);//创建Socket
byte[] data = new byte[1024];//创建数组,在创建数据报的时候需将该字节数组传入
DatagramPacket packet = new DatagramPacket(data, data.length);//创建数据报,将数据传入数组中
System.out.println("服务器已经启动,正在等待客户端的连接=====");
socket.receive(packet);//等待接收数据报,在接收前会一直阻塞
String info = new String(data,0,packet.getLength());
System.out.println("我是服务器,客户端发来信息:"+info);
//向客户端相应数据
InetAddress address = packet.getAddress();//根据传过来的数据报获取客户端的地址
int port = packet.getPort();//获取客户端端口
byte[] data2 = "欢迎您".getBytes();
DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);
socket.send(packet2);
socket.close();
}
}

客户端:

package com.Socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; public class Udpclient {
public static void main(String[] args) throws IOException {
InetAddress adress = InetAddress.getByName("localhost");
int port = 8887;
byte[] data = "用户名:admin;密码:123".getBytes();//定义发送信息并存到字节数组中
DatagramPacket packet =new DatagramPacket(data,data.length,adress,port);//将定义好的字节数组和传送的目标地址,目标端口封装成数据报
DatagramSocket socket = new DatagramSocket();//创建socket套接字
socket.send(packet);//发送数据报
byte[] data3 = new byte[1024];
DatagramPacket packet3 =new DatagramPacket(data3,data3.length);
socket.receive(packet3);
String info2 = new String(data3,0,packet3.getLength());
System.out.println("服务器对我说:"+info2);
socket.close();
}
}

java基础笔记(7)的更多相关文章

  1. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  2. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  3. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  4. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  5. Java基础笔记1

    java (开源,跨操作系统)j2ee jre java基础 javaoop java高级 JDK(JAVA developer Kitool): java开发工具 (开发人员使用) JRE(java ...

  6. Java基础笔记(一)——JDK、JRE、JVM

    JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...

  7. Java基础笔记05-06-07-08

    五.今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 ...

  8. Java基础笔记-抽象,继承,多态

    抽象类: abstract修饰 抽象方法必须定义在抽象类中,抽象类不能创建对象. 在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象. 特点是: 1.定义在抽象类中 2.方法和类都用abstr ...

  9. Java基础笔记(一)

    本文主要是我在看<疯狂Java讲义>时的读书笔记,阅读的比较仓促,就用 markdown 写了个概要. 第一章 Java概述 Java SE:(Java Platform, Standar ...

  10. JAVA基础笔记10-11-12-13-14

    十.今日内容介绍 1.继承 2.抽象类 3.综合案例---员工类系列定义 01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在J ...

随机推荐

  1. ESP8266---TCP Client

    ESP8266WiFi库里面还有其他重要内容,比如跟http相关的 WiFiClient.WiFiServer,跟https相关的 WiFiClientSecure.WiFiServerSecure ...

  2. Vue结合webpack实现路由懒加载和分类打包

    https://blog.csdn.net/weixin_39205240/article/details/80742723

  3. 【leetcode】1202. Smallest String With Swaps

    题目如下: You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] ...

  4. centos7下open--v!(p/n)部署

    一,client-server 路由模式 使用tun,openssl,lzo压缩,启用转发,生成证书,关闭selinux 同步下时间 #1安装 yum -y install openvpn easy- ...

  5. web上传文件夹

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  6. 【spoj2774】最长公共子串

    题目描述: 给你两个字符串,求它们最长公共子串的长度,如果不存在公共子串则输出0. 样例输入: yeshowmuchiloveyoumydearmotherreallyicannotbelieveit ...

  7. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...

  8. es之主分片和复制分片的交互过程

    1:索引(创建或者删除)一个文档 首先:发送一个索引或者删除的请求给node1 其次:node1接收到请求之后,会根据请求中携带的参数“文档id”判断出该文档应该存储在具体哪一个shard中 shar ...

  9. 64位ubuntu下安装ia32-libs

    echo "deb http://archive.ubuntu.com/ubuntu/ raring main restricted universe multiverse" &g ...

  10. 基本vim快捷键

    w,e等单词间跳转,英文字符(除了_),数字,符号,空格 都被vim独立看成独立的词