一、ServerSocket

java.lang.Object

  |-java.net.ServerSocket

有子类SSLServerSocket。

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

常用构造方法:

ServerSocket(int port)
          创建绑定到特定端口的服务器套接字。

常用方法:

 Socket

accept()
          侦听并接受到此套接字的连接。

 void

bind(SocketAddress endpoint)
          
ServerSocket 绑定到特定地址(IP 地址和端口号)。

void

close()
          
关闭此套接字。

 InetAddress

getInetAddress()
          
返回此服务器套接字的本地地址。

 int

getLocalPort()
          
返回此套接字在其上侦听的端口。

二、Socket

Java.lang.Object

|-java.net.Socket

常用构造方法:

Socket(InetAddress address, int port)
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(String host, int port)
          创建一个流套接字并将其连接到指定主机上的指定端口号。

常用方法:

void

bind(SocketAddress bindpoint)
          将套接字绑定到本地地址。

void

close()
          关闭此套接字。

void

connect(SocketAddress endpoint)
          将此套接字连接到服务器。

void

connect(SocketAddress endpoint, int timeout)
          将此套接字连接到服务器,并指定一个超时值。

InetAddress

getInetAddress()

          
返回套接字连接的地址。

InputStream

getInputStream()

          
返回此套接字的输入流。

OutputStream

getOutputStream()

          
返回此套接字的输出流。

int

getPort()

          
返回此套接字连接到的远程端口。

void

shutdownInput()

          
此套接字的输入流置于“流的末尾”。

void

shutdownOutput()

          
禁用此套接字的输出流。

三、DatagramSocket

Java.lang.Object

|-java.net.DatagramSocket

常用构造方法:

DatagramSocket(int port)
          创建数据报套接字并将其绑定到本地主机上的指定端口。

DatagramSocket(int port, InetAddress laddr)
          创建数据报套接字,将其绑定到指定的本地地址。

常用方法:

应当注意的是,该类既能发送数据包也能接受数据包

void

bind(SocketAddress addr)
          将此 DatagramSocket 绑定到特定的地址和端口。

void

close()
          关闭此数据报套接字。

void

connect(InetAddress address, int port)
          将套接字连接到此套接字的远程地址。

void

connect(SocketAddress addr)
          将此套接字连接到远程套接字地址(IP 地址 + 端口号)。

InetAddress

getInetAddress()

          
返回此套接字连接的地址。

void

receive(DatagramPacket p)
          
从此套接字接收数据报包。

void

send(DatagramPacket p)
          
从此套接字发送数据报包。

四、DatagramPacket

Java.lang.Object

|-java.net.DatagramPacket

常用构造方法:

构造方法摘要

DatagramPacket(byte[] buf, int length)
          构造 DatagramPacket,用来接收长度为 length
的数据包。

 

DatagramPacket(byte[] buf, int length, InetAddress address, int port)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

DatagramPacket(byte[] buf, int length, SocketAddress address)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

常用方法:

InetAddress

getAddress()
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

int

getPort()

          
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

void

setAddress(InetAddress iaddr)
          
设置要将此数据报发往的那台机器的 IP 地址。

void

setData(byte[] buf,
int offset, int length)

void

setPort(int iport)

          
设置要将此数据报发往的远程主机上的端口号。

void

setSocketAddress(SocketAddress address)
          
设置要将此数据报发往的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。

五、简单TCP应用实例1:服务端小写转大写服务

服务端程序:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; /**
* 这是服务端程序
* @author kuangdaoyizhimei
*
*/
public class Server
{
public static void main(String args[]) throws IOException
{
ServerSocket ss=new ServerSocket(7894);
Socket s=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"已连接。");
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=br.readLine())!=null)
{
System.out.println(str);
pw.println(str.toUpperCase());//注意println方法的使用在这里是必须的,否则会产生死锁
}
s.close();
ss.close();
}
}

客户端程序:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 这是客户端程序。
* @author kuangdaoyizhimei
*
*/
public class Client
{
public static void main(String args[]) throws UnknownHostException, IOException
{
Socket s=new Socket("192.168.1.101",7894);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader bin=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=br.readLine())!=null)
{
pw.println(str);
String result=bin.readLine();
System.out.println(result);//注意println方法的使用在这里是必须的,否则会产生死锁
}
s.close();
}
}

运行结果:

服务端运行结果:

客户端运行结果:

二、简单UDP服务演示:局域网群聊小程序。

程序使用的广播地址是192.168.1.255,每个客户端的接收端口是6544。

程序中使用了多线程技术。

 package p01.UDPTransferDemo.p01.UDPTransferDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* 接收线程ReceiveThread
* @author kuangdaoyizhimei
*/
class ReceiveThread implements Runnable
{
DatagramSocket ds=null;
public ReceiveThread(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run()
{
while(true)
{
try
{
byte buf[]=new byte[1024];
//2.创建接收数据报
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
//3.显示数据报信息
System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+":"+new String(dp.getData(),0,dp.getLength()));
}
catch(IOException e)
{
System.out.println("接受线程产生异常!");
}
}
}
}
/**
* 发送线程SendThread
* @author kuangdaoyizhimei
*
*/
class SendThread implements Runnable
{
DatagramSocket ds=null;
public SendThread(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run()
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
try {
while((str=br.readLine())!=null)
{
try
{
//2.创建发送数据包。
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.1.255"),6544);
//3.发送数据包
ds.send(dp);
}
catch(IOException e)
{
System.out.println("发送线程产生异常!");
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 主类UDPTransferDemo
* @author kuangdaoyizhimei
*
*/
public class UDPTransferDemo {
public static void main(String args[]) throws IOException
{
DatagramSocket Send=new DatagramSocket();
DatagramSocket Receive=new DatagramSocket(6544);
new Thread(new ReceiveThread(Receive)).start();
new Thread(new SendThread(Send)).start();
}
}

运行结果:

三、TCP应用之文本文件上传

在和源文件同一个文件夹中预先准备一个文本文件aim.txt,里面内容自定义。

服务端程序:

 package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo;

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket; public class TCPUpperLoadServer {
public static void main(String args[]) throws IOException
{
ServerSocket ss=new ServerSocket(9876);
Socket s=ss.accept();
InputStream is=s.getInputStream();
BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
OutputStream os=s.getOutputStream();
BufferedWriter bwOut=new BufferedWriter(new OutputStreamWriter(os));
String str=null;
File file=new File("副本.txt");
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
while((str=brIn.readLine())!=null)
{
System.out.println(str);
bw.write(str);
bw.newLine();//此处换行是为了写到文件的换行
bw.flush();
}
bw.close();
bwOut.write("上传成功!");
bwOut.flush();
s.close();
}
}

客户端程序:

 package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo;

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUpperLoadClient { public static void main(String[] args) throws UnknownHostException, IOException
{
Socket socket=new Socket("192.168.209.1",9876);
InputStream is=socket.getInputStream();
BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
File file=new File("aim.txt");
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String str=null;
while((str=br.readLine())!=null)
{
bw.write(str);
bw.newLine();//此处换行是为了给服务器端读取一行的结束标记。
bw.flush();
}
socket.shutdownOutput();//没有这一句话两端将都处于等待状态。
br.close();
str=brIn.readLine();
System.out.println(str);
}
}

运行结果:

四、TCP应用之媒体文件上传。

准备:aim.mp4文件,放在和源代码文件同一个目录下

客户端:

 package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUpperLoadMultipleFileClient { public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket=new Socket("192.168.209.1",9876);
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
byte buf[]=new byte[1024];
File file=new File("aim.mp4");
FileInputStream fis=new FileInputStream(file);
int length=0;
while((length=fis.read(buf))!=-1)
{
os.write(buf, 0, length);
os.flush();
}
fis.close();
socket.shutdownOutput(); /**
* 显示上传状态信息
*/
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=br.readLine();
System.out.println(str);
socket.close();
} }

服务端:

 package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPUpperLoadMultipleFileServer { public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(9876);
Socket socket=ss.accept();
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
FileOutputStream fos=new FileOutputStream(new File("副本.mp4"));
byte buf[]=new byte[1024];
int length=-1;
while((length=is.read(buf))!=-1)
{
fos.write(buf, 0, length);
fos.flush();
}
fos.close();
os.write("文件上传成功!".getBytes());
socket.close();
ss.close();//服务器一般不关闭,这里只是用于演示,所以关闭。
}
}

运行结果:

五、TCP应用之QQ群聊。

客户端之输入端:

 /**
* 此程序模拟QQ输入
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPTransferQQImitateClient { public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("这是用户信息输入窗口:");
Socket socket=new Socket("192.168.209.1",8080);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=br.readLine())!=null)
{
if(str.equals("over"))
{
break;
}
pw.println(str);
}
br.close();
pw.close();
socket.shutdownOutput();
socket.close();
}
}

客户端之接收端:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 此程序模拟群聊输出
* @author kuangdaoyizhimei
*
*/
public class ReceiveInformationClient { public static void main(String[] args) throws IOException {
System.out.println("这是群聊显示窗口:");
ServerSocket ss=new ServerSocket(8000);
while(true)
{
Socket s=ss.accept();
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;
str=br.readLine();
System.out.println(str);
}
}
}

服务端之用户接入端:

 /**
* 此程序模拟服务器处理用户接入
*/
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.HashSet; public class TransmitServer {
public static void main(String[] args) throws IOException {
System.out.println("这是服务器处理多线程窗口:");
ServerSocket ss=new ServerSocket(8080);
HashSet<String>hs=new HashSet<String>();
while(true)
{
Socket socket=ss.accept();
System.out.println("用户"+socket.getInetAddress().getHostName()+"接入!");
Thread thread=new Thread(new ClientHandle(socket,hs));
thread.start();
}
}
}

服务端之转发端:

 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.util.HashSet;
/**
* 此程序模拟服务器处理单个用户的线程接入和数据转发。
* @author kuangdaoyizhimei
*
*/
public class ClientHandle implements Runnable {
private Socket socket;
private HashSet<String>list;
public ClientHandle(Socket socket, HashSet<String> list) {
this.socket=socket;
this.list=list;
} @Override
public void run() {
System.out.println("这是服务器处理单线程窗口:(核心窗口)");
try
{
list.add(socket.getInetAddress().getHostAddress());
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String ip=socket.getInetAddress().getHostAddress();
int port=socket.getPort();
String str=ip+":"+port+" :";
String temp=null;
while((temp=br.readLine())!=null)
{
for(String s:list)
{
Socket sk=new Socket(s,8000);
OutputStream osm=sk.getOutputStream();
PrintWriter pw=new PrintWriter(osm,true);
pw.println(str+temp);
sk.close();
}
}
}
catch(IOException e)
{
System.out.println("用户"+socket.getInetAddress().getHostAddress()+"退出!");
}
}
}

运行结果:

【JAVA网络流之TCP与UDP 】的更多相关文章

  1. java学习之tcp与udp的实现

    package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  2. Java基础之TCP与UDP

    OSI 7层参考模型 物理层 --> 数据链路层 --> 网络层 --> 传输层 --> 会话层 --> 表示层 --> 应用层 按此顺序称为拆包,反之为封包. T ...

  3. Java中的TCP/UDP网络通信编程

    127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...

  4. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  5. Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天

    网络编程 网络模型 *OSI参考模型 *Tcp/IP参考模型 网络通读要素 *IP地址 *端口号 *传输协议 1.找到对方Ip 2.数据要发送到对方指定的的应用程序上,为了标识这些应用程序,所经给这些 ...

  6. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...

  7. Java Socket实现基于TCP和UDP多线程通信

    一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...

  8. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  9. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

随机推荐

  1. vtigerCRM5.4的安装和汉化 ubuntu

    由于php5.5经过较大改变,安装vtigercrm的时候可能需要修改一些配置 1.去官网下载vtiger5.4压缩包,解压后放在/var/www目录下 2.简单起见,将目录权限设置为777 vtig ...

  2. 3分钟,9个Q&A让你快速知道Docker到底是什么

    不论是Google.Amazon.Microsoft.VMware都纷纷拥戴,加入Docker和Container所掀起的新时代云端虚拟化行列,这两项技术成为了IT界的新趋势.Docker和Conta ...

  3. 百度云+ KeePass 网络同步你的密码

     百度云+ KeePass 网络同步你的密码   百度云一个目前不限流量不限格式能直链的网盘,速度在我这里很快,难得了!KeePass(小众介绍过 KeePass.) 是一个免费开源的密码管理类软件, ...

  4. rabbitmq使用

    1. 用户管理 用户管理包括增加用户,删除用户,查看用户列表,修改用户密码. 相应的命令 (1) 新增一个用户 rabbitmqctl  add_user  Username  Password (2 ...

  5. struts2 复杂参数封装

    1.1.1    Struts2中封装复杂类型的数据: 封装到List集合: 页面: 商品名称:<input type="text" name="products[ ...

  6. checksum table 【转】

    来自:http://dinglin.iteye.com/blog/1791922 有同学问到 checksum table在逻辑备份时候前后是否可以用于验证数据一致性.扩展一下发现有一些有趣的问题,比 ...

  7. 省市县联动dropdownlist

    下面就是在提交按钮的单击事件中填写代码(代码区)(前提是把省市县的数据库建好) protected void Page_Load(object sender, EventArgs e)         ...

  8. java基础学习05(面向对象基础02)

    面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...

  9. codeforces 556B. Case of Fake Numbers 解题报告

    题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每 ...

  10. 使用iScroll时,input等不能输入内容的解决方法

    做移动平台的应用,使用iscroll使屏幕上下滑动.发现当使用iscroll后,input等不能输入内容了.只要在iscroll.js文件中加入如下代码就ok了. function allowForm ...