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

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实现基于TCP的Socket通信:

在服务器端,创建ServerSocket对象,绑定监听端口;通过accept方法监听客户请求;建立连接后,通过输入流读取客户端发送的请求;通过输入流向客户端发送响应信息;关闭相关资源。

public class Server {
public static void main(String[] args) {
try {
//创建一个服务器端Socket,指定绑定的端口,
ServerSocket serverSocket=new ServerSocket(8888);
//调用accept()监听,等待客户端的连接
System.out.println("服务器即将启动 ,等待客户端的连接");
Socket socket=serverSocket.accept();
//获取输入流,读取客户端信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);//将字节流转为字符流
BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
String info=null;
while((info=br.readLine())!=null){
System.out.println("服务器,客户端:"+info);
}
socket.shutdownInput(); br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

在客户端,创建Socket对象,指明要连接的服务器地址和端口号;建立连接后,通过输出流想服务器端发送请求信息;通过输入流获取服务器响应的信息;关闭相关资源。

public class Client {
public static void main(String[] args) {
try {
//创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//获取输出流,向服务器发送信息
OutputStream os=socket.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:123");
pw.flush();//刷新缓存,向服务器端提供信息
socket.shutdownOutput();//关闭输出流 pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

服务器响应客户端:

//获取输入流,响应客户端的请求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//包装为打印流
pw.write("欢迎您");
pw.flush();//调用flush方法将缓冲输出
pw.close();
os.close();

客户端:

//获取输入流,读取服务器端的响应信息
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("客户端,服务器:"+info);
}
br.close();
is.close();

使用多线程实现多客户端的通信:

ServerTherad类

public class ServerThread extends Thread{
Socket socket=null;
public ServerThread(Socket socket){
this.socket=socket;//初始化和本线程相关的socket
}
//线程执行的操作,响应客户端的请求
public void run(){
//获取输入流,读取客户端信息
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
//获取输入流,响应客户端的请求
OutputStream os=null;
PrintWriter pw=null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("服务器,客户端:"+info);
}
socket.shutdownInput();
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您");
pw.flush();//调用flush方法将缓冲输出
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

Server类

public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(8888);
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.print("当前客户端的IP:"+address.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实现基于UDP的Socket通信:

UDP协议(用户数据报协议)是无连接的,不可靠的,无序的,速度相对较快,以数据报作为数据传输的载体:
  在进行数据传输时,将数据定义成数据报(Datagram),在数据报中致命数据要达到 的Socket(主机地址和端口号),然后发送数据报。
相关操作类:
DatagramPacket:数据报包   DatagramSocket:进行 端到端通信的类
服务器端:
创建DatagramSocket,指定端口号
创建DatagramPacket
接收客户端发送的数据信息
读取数据
客户端:
定义发送信息
创建DatagramPacket,包含要发送的信息
创建DatagramSocket

--------------------------

实现基于UDP的用户登录

服务器端要早于客户端启动

//服务器端
public static void main(String[] args) throws IOException {
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
//2.创建数据报
byte[] data=new byte[1024];//穿件字节数组,指定接收的数据报的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
socket.receive(packet);//在接收到数据报之前处于阻塞状态
//4.读取数据
String info=new String(data, 0, packet.getLength());
System.out.println("服务器: 客户端,"+info); /*
* 向客户端相应数据
*/
//1.定义客户端的地址,端口号,数据
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="欢迎您".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();
}
//客户端
public static void main(String[] args) throws IOException {
//1.定义服务器的地址,端口号,数据
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="用户名:admin;密码:123".getBytes();//转化成字节数组
//2.创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4向服务器端发送数据报
socket.send(packet);
/*
* 接收服务器端响应的数据
*/
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//2.接收服务器端响应的数据
socket.receive(packet2);//接收并保存在packet2中
//3.读取信息
String reply=new String(data2, 0,packet2.getLength());
System.out.println("客户端:服务器"+reply);
//4.关闭资源
socket.close();
}

mooc_java Socket的更多相关文章

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

随机推荐

  1. UNP学习笔记(第一章 简介)

    环境搭建 1.下载解压unpv13e.tar.gz 2.进入目录执行 ./configurecd lib //进入lib目录make //执行make命令 3.将生成的libunp.a静态库复制到/u ...

  2. apue学习笔记(第十三章 守护进程)

    本章将说明守护进程结构,以及如何编写守护进程程序. 守护进程,也就是通常说的Daemon进程,是Unix中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理 ...

  3. XML基础知识学习

    概念: XML 指可扩展标记语言 XML 是一种标记语言,非常类似 HTML ,文本文件. XML 的设计宗旨是数据传输,而非显示数据 .存储和传输复杂的关系模型数据 XML 标签没有被提前定义 使用 ...

  4. HDMI原理图信号PIN脚

    HDMI(19Pin)/DVI(16 pin)的功能是热插拔检测(HPD),这个信号将作为主机系统是否对HDMI/DVI是否发送TMDS信号的依据.HPD是从显示器输出送往计算机主机的一个检测信号.热 ...

  5. containsKey使用方法

    作用是判断Map中是否有所需要的键值,下面是具体的代码: public static void main(String[] args) { Map<String, String> map ...

  6. PHP计划任务:如何使用Linux的Crontab执行PHP脚本(转)

    我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现.但这两种方法都不太可靠,不稳定.我们可以借助Linux的Crontab工具来稳 ...

  7. Bootstrap--常用及实例合集

    栅格系统 1. row必须放到container和container-fluid里面        2. 你的内容应当放置于“列(column)”内,并且,只有“列(column)”可以作为行(row ...

  8. 智能手机的耗电特征及APP耗电量测试的两种方法

    文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...

  9. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity pas ...

  10. Redis单台的安装部署及集群部署

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...