Socket通讯的简单用法
1.客户端
package Thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Click {
public static void main(String[] args) throws UnknownHostException, IOException {
Click click=new Click();
click.start();
}
private Socket socket;
public Click() throws UnknownHostException, IOException {
socket=new Socket("localhost", 8088);//连接指定的地址和端口
}
public void start() throws IOException {
System.out.println("欢迎你,"+socket.getInetAddress());
PrintWriter pw=null;
//创建一条线程读取 服务器端发送过来的信息。
Thread t=new Thread(new ServerHandler());
t.setDaemon(true);//守护线程
t.start();
try {
// 输出流,将客户端的消息发送出去
pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
Scanner scan=new Scanner(System.in);
while(true){
pw.println(scan.nextLine());
}
} catch (UnsupportedEncodingException e) {
System.out.println("io流异常");
} finally {
if(socket!=null) {
socket.close();
}
}
}
//读取服务端发送的消息
class ServerHandler implements Runnable{
public void run() {
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println("IOException");
}
}
}
}
2.服务端
package Thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
public static void main(String[] args) throws IOException {
Server server=new Server();
server.start();
}
//成员变量
private ExecutorService threadPool;
private ServerSocket serverSocket;
private List<PrintWriter>allOut;
public Server() throws IOException {//初始化变量
serverSocket=new ServerSocket(8088);
threadPool=Executors.newFixedThreadPool(3);
allOut=new ArrayList<PrintWriter>();
}
public void start() {
try {
while(true) {
System.out.println("等待客户端连接");
Socket socket=serverSocket.accept();//监听客户端的连接
//每连接一条线程
threadPool.execute(new ClickHandler(socket));
}
} catch (IOException e) {
System.out.println("socket Exection");
}
}
class ClickHandler implements Runnable{
private Socket socket;
public ClickHandler(Socket socket) {
this.socket=socket;
}
//线程同步
public synchronized void addOut(PrintWriter pw) {
allOut.add(pw);
}
public synchronized void pwClose(PrintWriter pw) {
pw.close();
}
public void run() {
BufferedReader br;
PrintWriter pw=null;
try {
System.out.println(socket.getInetAddress()+"连接成功");
br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
//使用输出流将信息发到客户端
pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"), true);
addOut(pw);
String message=null;
while((message=br.readLine())!=null) {
for(PrintWriter p:allOut) {
if(p!=pw) {
p.println(socket.getInetAddress()+":"+message);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pwClose(pw);
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
end
Socket通讯的简单用法的更多相关文章
- erlang和java的socket通讯----最简单,初次实现。
直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- java socket通讯(一) 入门示例
一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...
- 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...
- c#写个基础的Socket通讯
晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...
- Silverlight下的Socket通讯
http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html 在Silverlight中进行通讯,只能使用4502-453 ...
- 试解析Tomcat运行原理(一)--- socket通讯(转)
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
随机推荐
- Go语言 Note
1.简单的CURD之搭建基础框架 //路由层 func Router(rg *gin.RouterGroup){ rg.GET("/getsupplier", facility.G ...
- SqlServer查看锁表与解锁
某些情况下,sqlserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住 其他任何连接查询表数据时都不会返回 这时需要手工杀掉产生死锁的会话ID,才能恢复正常 查看 ...
- sql数据库系统表和mysql系统表
sql数据库系统表,常用的(sysobjects,sysindexes,sysindexkeys,SYSCOLUMNS,SYSTYPES 及更多解释说明): https://docs.microsof ...
- Python Sphinx使用踩坑记录
描述 使用 pip 安装sphinx后,按照教程建立了一个新的py文件,如下 # run.py def run(name): """ this is how we run ...
- java List 去重方式及效率对比
01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代 ...
- NAND Flash驱动
硬件原理及分析 管脚说明 Pin Name Pin Function R/B(RnB) The R/B output indicates the status of the devic ...
- mysql基本知识的总结
Mysql基本sql知识 Navicat快捷方式: 选中当前行 在行尾:shift+home 在行首:shift+end 执行当前行:ctrl+shift+R 复制当前行:ctrl+D 显示所有数据库 ...
- linux添加一个已经存在用户到一个用户组
在使用virtual-box的共享文件时,在虚拟机中共享文件的用户为root,用户组为vboxsf, 所以需要将自己添加到vboxsf这组当中去,一开始使用useradd老是失败,后来才查到要用use ...
- golang用slice、list当queue
背景 golang没有queue这种类型,不过可以用slice.list模拟 slice当queue 声明队列 var queue []int 入队一个元素: queue = append(queue ...
- 哈希(hash)理解
转载自https://www.cnblogs.com/mingaixin/p/4318837.html 一.什么是哈希?(一种更复杂的映射) Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就 ...