java线程池socket

关于 java socket的消息推送问题

关于 java socket的消息推送问题,首先:开启服务端,并暴露出端口。然后通过一个while的死循环去不停的接收来自客户端的socket,并且通过一个ArrayList来维护。并且通过子线程去对list中的socket进行操作。

其次:客户端去访问服务器的端口。开启一个子线程去不停的接收来自服务端的消息。

然而关于推送服务的更多内容,可以通过深圳极光公司了解一下。深圳市和讯华谷信息技术有限公司(极光 Aurora Mobile)成立于2011年,是中国领先的开发者服务提供商,专注于为开发者提供稳定高效的消息推送、一键认证以及流量变现等服务,助力开发者的运营、增长与变现。

同时,极光的行业应用已经拓展至市场洞察、金融风控与商业地理服务,助力各行各业优化决策、提升效率。

java:ServerSocket中获取所有连接上的Socket

可以的。

首先确保你已经建立了ServerSocket(对象名字是server),并接受到了连接:

ArrayListSocket sockets = new ArrayListSocket(); //保存所有接受的socket

while(true){ //一直接受连接

Socket s = server.accept();

sockets.add(s);

}

///得到仍处于连接当中的Socket

public ArrayListSocket getConnectedSockets(){

ArrayListSocket alivedSockets = new ArrayListSocket();

for(int i=0;isockets.size();i++){

if(sockets.get(i).isConnected()){

alivedSockets .add(sockets.get(i));

}

}

return alivedSockets;

}

java线程池socket

java中怎么用socket 一次传多个文件啊?

java中用socket一次传多个文件,参考思路如下:

1、把线程放到Vector 线程池里面;

2 、每次从Vector里面拿到第一个空闲的,如果没有,就新建一个线程,并保存到线程池, 线程状态为使用中;

3 、线程完毕后,通知管理类,管理类把线程标识为空闲;

可以封装为简单的方法,如下:

public MyThread getFreeThread(){

.. // 从池里面获取一个空闲线程

}

public void finished(MyThread o){

// 线程通知管理类,我已经完成了

}

用Java实现一个人和几个不同的人私聊,用Socket实现

package API_Day09;

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.Socket;

import java.util.Scanner;

/**

* 控制台聊天程序

* 客户端应用程序

* @author Jacob

*

*/

public class chatClient

{

//客户端用于与服务端连接的Socket

private Socket clientSocket;

/**

* 构造方法,客户端初始化

*/

public chatClient()

{

try

{

/*

* socket(String host, int port)

* 地址: IP地址,用来定位网络上的计算机

* 端口: 用来找到远端计算机上用来连接的服务端应用程序

*/

clientSocket = new Socket(“www.easyaq.com”,12580);

}

catch (Exception e)

{

e.printStackTrace();

}

}

/**

* 客户端昵称验证方法

* @param 为Scanner

*/

private void inputNickName(Scanner scan) throws Exception

{

String nickName = null;

//创建输出流

PrintWriter pw = new PrintWriter(

new OutputStreamWriter(clientSocket.getOutputStream(),

“UTF-8”),true);

//创建输入流

BufferedReader br = new BufferedReader(

new InputStreamReader(

clientSocket.getInputStream(),”UTF-8″));

while(true)

{

System.out.println(“请创建您的昵称:”);

nickName = scan.nextLine();

if (nickName.trim().equals(“”))

{

System.out.println(“昵称不得为空”);

}

else

{

pw.println(nickName);

String pass = br.readLine();

if(pass!=null!pass.equals(“OK”))

{

System.out.println(“昵称已经被占用,请更换!”);

}

else

{

System.out.println(“你好!”+nickName+”可以开始聊天了”);

break;

}

}

}

}

/*

* 客户端启动的方法

*/

public void start()

{

try

{

/*

* 创建Scanner,读取用户输入内容

* 目的是设置客户端的昵称

*/

Scanner scanner = new Scanner(System.in);

inputNickName(scanner);

/*

* 将用于接收服务器端发送过来的信息的线程启动

*/

Runnable run = new GetServerMsgHandler();

Thread t = new Thread(run);

t.start();

/*

* 建立输出流,给服务端发信息

*/

OutputStream os = clientSocket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,”UTF-8″);

PrintWriter pw = new PrintWriter(osw,true);

while(true)

{

pw.println(scanner.nextLine());

}

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(clientSocket !=null)

{

try

{

clientSocket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

/**

* 该线程体用来循环读取服务端发送过来的信息

* 并输出到客户端的控制台

* @param args

*/

class GetServerMsgHandler implements Runnable

{

@Override

public void run()

{

try

{

InputStream is = clientSocket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,”UTF-8″);

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!= null)

{

System.out.println(“服务端提示:”+ msgString);

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

chatClient client = new chatClient();

client.start();

}

}

package API_Day09;

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;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 控制台聊天程序

* 服务端应用程序

* @author Jacob

*

*/

public class chatServer

{

/**

* ServerSocket 是运行在服务端的Socket

* 用来监听端口,等待客户端的连接,

* 一旦连接成功就会返回与该客户端通信的Socket

*/

private ServerSocket serverSocket;

/**

* 创建线程池来管理客户端的连接线程

* 避免系统资源过度浪费

*/

private ExecutorService threadPool;

/**

* 该属性用来存放客户端之间私聊的信息

*/

private MapString,PrintWriter allOut;

/**

* 构造方法,服务端初始化

*/

public chatServer()

{

try

{

/*

* 创建ServerSocket,并申请服务端口

* 将来客户端就是通过该端口连接服务端程序的

*/

serverSocket = new ServerSocket(12580);

/*

* 初始化Map集合,存放客户端信息

*/

allOut = new HashMapString, PrintWriter();

/*

* 初始化线程池,设置线程的数量

*/

threadPool = Executors.newFixedThreadPool(10);

/*

* 初始化用来存放客户端输出流的集合,

* 每当一个客户端连接,就会将该客户端的输出流存入该集合;

* 每当一个客户端断开连接,就会将集合中该客户端的输出流删除;

* 每当转发一条信息,就要遍历集合中的所有输出流(元素)

* 因此转发的频率高于客户端登入登出的频率,

* 还是应该使用ArrayList来存储元素,仅限群聊,私聊不行

* allOut = new ArrayListPrintWriter();

*/

}

catch (Exception e)

{

e.printStackTrace();

}

}

/*

* 将客户端的信息以Map形式存入集合中

*/

private void addOut(String key,PrintWriter value)

{

synchronized(this)

{

allOut.put(key, value);

}

}

/*

* 将给定的输出流从共享集合中删除

* 参数为客户端nickName,作为Map的key键

*/

private synchronized void removeOut(String key)

{

allOut.remove(key);

System.out.println(“当前在线人数为:”+ allOut.size());

}

/*

* 将给定的消息转发给所有客户端

*/

private synchronized void sendMsgToAll(String message)

{

for(PrintWriter out: allOut.values())

{

out.println(message);

System.out.println(“当前在线人数为:”+ allOut.size());

}

}

/*

* 将给定的消息转发给私聊的客户端

*/

private synchronized void sendMsgToPrivate(String nickname,String message)

{

PrintWriter pw = allOut.get(nickname); //将对应客户端的聊天信息取出作为私聊内容发送出去

if(pw!=null)

{

pw.println(message);

System.out.println(“当前在线私聊人数为:”+ allOut.size());

}

}

/**

* 服务端启动的方法

*/

public void start()

{

try

{

while(true)

{

/*

* 监听10086端口

*/

System.out.println(“等待客户端连接… … “);

/*

* Socket accept() 这是一个阻塞方法,会一直在10086端口进行监听

* 直到一个客户端连接上,此时该方法会将与这个客户端进行通信的Socket返回

*/

Socket socket = serverSocket.accept();

System.out.println(“客户端连接成功! “);

/*

* 启动一个线程,由线程来处理客户端的请求,这样可以再次监听

* 下一个客户端的连接了

*/

Runnable run = new GetClientMsgHandler(socket);

threadPool.execute(run); //通过线程池来分配线程

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

/**

* 该线程体用来处理给定的某一个客户端的消息,循环接收客户端发送

* 的每一个字符串,并输出到控制台

* @author Jacob

*

*/

class GetClientMsgHandler implements Runnable

{

/*

* 该属性是当前线程处理的具体的客户端的Socket

* @see java.lang.Runnable#run()

*/

private Socket socket;

/*

* 获取客户端的地址信息

* private String hostIP;

*/

/*

* 获取客户端的昵称

*/

private String nickName;

/*

* 创建构造方法

*/

public GetClientMsgHandler(Socket socket)

{

this.socket = socket;

/*

* 获取远端客户的Ip地址信息

* 保存客户端的IP地址字符串

* InetAddress address = socket.getInetAddress();

* hostIP = address.getHostAddress();

*/

}

/*

* 创建内部类来获取昵称

*/

private String getNickName() throws Exception

{

try

{

//服务端的输入流读取客户端发送来的昵称输出流

InputStream iin = socket.getInputStream();

InputStreamReader isr =

new InputStreamReader(iin,”UTF-8″);

BufferedReader bReader = new BufferedReader(isr);

//服务端将昵称验证结果通过自身的输出流发送给客户端

OutputStream out = socket.getOutputStream();

OutputStreamWriter iosw =

new OutputStreamWriter(out,”UTF-8″);

PrintWriter ipw = new PrintWriter(iosw,true);

//读取客户端发来的昵称

String nameString = bReader.readLine();

while(true)

{

if(nameString.trim().length()==0)

{

ipw.println(“FAIL”);

}

if(allOut.containsKey(nameString))

{

ipw.println(“FAIL”);

}

else

{

ipw.println(“OK”);

return nameString;

}

nameString = bReader.readLine();

}

}

catch(Exception e)

{

throw e;

}

}

@Override

public void run()

{

PrintWriter pw = null;

try

{

/*

* 通过客户端的Socket获取客户端的输出流

* 用来将消息发送给客户端

*/

OutputStream os = socket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,”UTF-8″);

pw = new PrintWriter(osw,true);

/*

* 将客户昵称和其所说的话作为元素存入共享集合HashMap中

*/

nickName = getNickName();

addOut(nickName, pw);

Thread.sleep(100);

/*

* 服务端通知所有客户端,某用户登录

*/

sendMsgToAll(“[系统通知]:欢迎**”+nickName+”**登陆聊天室!”);

/*

* 通过客户端的Socket获取输入流

* 读取客户端发送来的信息

*/

InputStream is = socket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,”UTF-8″);

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!=null)

{

//验证是否是私聊

if(msgString.startsWith(“@”))

{

/*

* 私聊格式:@昵称:内容

*/

int index = msgString.indexOf(“:”);

if(index =0)

{

//获取昵称

String name = msgString.substring(1,index);

String info = msgString.substring(index+1,msgString.length());

info = nickName + “对你说:”+ info;

//将私聊信息发送出去

sendMsgToPrivate(name, info);

//服务端不在广播私聊的信息

continue;

}

}

/*

* 遍历所有输出流,将该客户端发送的信息转发给所有客户端

*/

System.out.println(nickName+”说:”+ msgString);

sendMsgToAll(nickName+”说:”+ msgString);

}

}

catch (Exception e)

{

/*

* 因为Win系统用户的客户端断开连接后,br.readLine()方法读取

* 不到信息就会抛出异常,而Linux系统会持续发送null;

* 因此这里就不在将捕获的异常抛出了。

*/

}

finally

{

/*

* 当执行到此处时,说明客户端已经与服务端断开连接

* 则将该客户端存在共享集合中的输出流删除

*/

removeOut(nickName);

/*

* 通知所有客户端,某某客户已经下线

*/

sendMsgToAll(“[系统通知]:”+nickName + “已经下线了。”);

/*

* 关闭socket,则通过Socket获取的输入输出流也一同关闭了

*/

if(socket!=null)

{

try

{

socket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

}

public static void main(String[] args)

{

chatServer server = new chatServer();

server.start();

}

}

我的作业,供你参考

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月24日 11:13:30
下一篇 2024年3月24日 11:19:56

相关推荐

  • 深入java虚拟机pdf,深入java虚拟机 中村成洋 pdf

    在linux环境下,java怎么实现从word格式转换为pdf格式 //设置当前使用的打印机,我的Adobe Distiller打印机名字为 Adobe PDF wordCom.setProperty( ActivePrinter , new Variant( Adobe PDF ));//设置printout的参数,将word文档打印为postscript…

    2024年5月23日
    4600
  • java截取指定长度字符串,java截取指定字符串之后的

    java中如何截取字符串中的指定一部分 第一个参数是开始截取的字符位置。(从0开始)第二个参数是结束字符的位置+1。(从0开始)indexof函数的作用是查找该字符串中的某个字的位置,并且返回。 int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;split讲解:java.lang.string.split split 方法 将…

    2024年5月23日
    4400
  • java绑定一个端口,java使用端口

    java如何多个service共用一个端口 你如果有多个项目的话,你可以把多个项目放到一个tomcat里面,这样端口相同使用项目名称来进行区分项目。你如果非要使用同一个,你也可以配置不同的域名导向不同的项目。就是访问的域名不同转接到的项目不同。 如果需要同时启动多个程序,要么修改tomcat的配置文件中的监听端口。要么修改jar包程序的监听端口。不能在一台服…

    2024年5月23日
    3600
  • java多线程并发编程基础,Java多线程并发执行返回

    电脑培训分享Java并发编程:核心理论 电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。 人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接…

    2024年5月23日
    4800
  • 自学java找工作,自学java找工作需要包装简历吗

    自学java学多久可以找到工作 1、自学Java至少需要一年以上的时间才能达到找工作的水平。报班培训四到六个月的时间就可以找到一份不错的工作。 2、自学Java至少需要一年以上的时间才能达到找工作的水平。 3、如果要想找到一份Java相关的工作,需要至少学习5-6个月时间才能就业。Java开发需要掌握一些基础的编程语言知识,比如掌握面向对象的编程思想、基本的…

    2024年5月23日
    4400
  • java左移右移,java 左移

    java位移问题 1、思路:直接用Integer类的bit运算操作。 2、移位操作:左移:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 3、Java 位运算 Java 位运算[转]一,Java 位运算表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的…

    2024年5月23日
    4300
  • java技术规范,java规范性要求

    现在主流的JAVA技术是什么? java最流行开发技术程序员必看 1 、Git Git一直是世界上最受欢迎的Java工具之一,也是Java开发人员最杰出的工具之一。Git是一个开源工具,是-种出色的分布式版本控制解决方案。 (1).Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱和注解。(2).Java面向对象编…

    2024年5月23日
    4100
  • javasocket编程,Java socket编程中,禁用nagle算法的参数

    Java进行并发多连接socket编程 1、Java可利用ServerSocket类对外部客户端提供多个socket接口。基本的做法是先创建一个ServerSocket实例,并绑定一个指定的端口,然后在这个实例上调用accept()方法等待客户端的连接请求。 2、Socket socket=server.accept(0;Thread handleThrea…

    2024年5月23日
    4700
  • javaservlet是不是线程安全的,servlet线程安全吗

    java问题,servlet问题,servlet在什么时候被初始化?它是线程安全吗? Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求。所以Servlet是线程不安全的。 ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。 Ser…

    2024年5月23日
    5200
  • java死亡,java死代码是什么意思

    我的世界传送回死亡点指令是什么? 1、下面就让我们一起来了解一下吧:我的世界回到死的地方的指令是输入/back,就可以回到死亡地点了,当然也可以看信标,因为死亡后会有一道光集中在死亡点,只要循着光就可以找到目的地了。 2、在服务器中的指令 首先打开指令台,在指令行输入“/back”就可以回到自己的死亡地点了。在单人游戏中的指令 在单人游戏中,您无法直接返回到…

    2024年5月23日
    4900

发表回复

登录后才能评论



关注微信