1. java高手请进,关于javasocket通信问题,为什么Server服务器不能转发数据到Client,解决了再加分
这样,你让服务器端,接到一个客户端的socket,就开一个线程,每个客户端在服务器里都有一个自己的线程,这就不会造成多客户端只有一个被响应了,但这种方法只适用于客户端相对较少的情况。
2. java socket服务器怎么给所有客户端发系统消息
package Server;
import java.io.*;
import java.net.*;
import message.MessageType;
//该线程用于和客服端进行通信,是一个线程类
public class extends Thread{
Socket s=null;
ObjectInputStream ois=null;
MessageType mt=null;
ObjectOutputStream oos=null;
public (Socket s){
this.s=s;
}
public void run(){
//不停地从socket里面读取数据
while(true){
try {
ois=new ObjectInputStream(s.getInputStream());
mt=(MessageType)ois.readObject();
System.out.println("服务器读取到的信息");
System.out.println(mt.getContent()+" "+mt.getGetter()+" "+
mt.getMessagetype()+mt.getSendTime());
//将读取到的数据转发给对应的客服端
System.out.println("从集合里面可以找到用户压迫将数据发送给"+ ManageOnlineUser.hm.get(mt.getGetter()));
oos=new ObjectOutputStream(( ManageOnlineUser.hm.get(mt.getGetter())).getOutputStream());
oos.writeObject(mt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3. java socket发送字符串
java中socket是向某个特定地址的端口发送流(字符串通过getBytes方法转换成流)。
publicstaticvoidmain(String[]args){
Sockets;
try{
s=newSocket("localhost",9091);
DataOutputStreamout=newDataOutputStream(s.getOutputStream());
out.write("aslkjlksjdsad".getBytes());
out.flush();
out.close();
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
备注:有发送的话,就需要相应的地址和端口上做一个接收的,来实现交互。
4. java socket 如何告诉第二个客户端及后面的socket 已经有连接了
代理服务器解析客户端传入的数据,得到服务器ip和端口,然后创建与服务器的连接。解析代码如下:(这里只处理了socket v5的情况,Config的常量对应java.net.SocksConsts)
try {
// socket v5
// 4byte(5 2 0 2) @see java.net.SocksSocketImpl
int len = dis.read(buffer);
// reply client
dos.write(new byte[]{Config.PROTO_VERS, Config.NO_AUTH});
dos.flush();
// read
// PROTO_VERS(1byte)
// CONNECT(1byte)
// 0(1byte)
// DOMAIN_NAME/IPV4/IPV6(1byte) DOMAIN_NAME(not consider now)
// addr(IPV4:4byte/IPV6:16byte)
// port>>8&0xff(1byte)
// port&0xff(1byte)
len = dis.read(buffer);
byte addrType = buffer[3];
byte[] applyData = null;
String serverIp = null;
int serverPort = 0;
if (addrType == Config.IPV4) {
serverIp = Util.bytes2ipv4(buffer, 4, 4);
serverPort = buffer[8] << 8 | buffer[9];
// set reply data
applyData = new byte[10];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV4;
for (int i = 4; i < 10; i++) {
// fill ip, port
applyData[i] = buffer[i];
}
} else if (addrType == Config.IPV6) {
serverIp = Util.bytes2ipv6(buffer, 4, 16);
serverPort = buffer[20] << 8 | buffer[21];
// set reply data
applyData = new byte[6];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV6;
applyData[4] = buffer[20];
applyData[5] = buffer[21];
}
// reply
dos.write(applyData);
dos.flush();
// connect the server
// serverIp是服务器ip,serverPort是服务器端口,用这两个
// 创建与服务器的socket连接
Socket socket = new Socket(serverIp, serverPort);
// 之后处理客户端与服务器的数据交互就用这个socket转发就行了
// finally success!!!
} catch (Exception e) {
e.printStackTrace();
}
5. Java socket 之服务端转发消息
服务器端一般会存储所有会话信息(在启动会话时),客户端A发送信息给服务器端 ,服务器端进@OnMessage 方法,通过url传参获取发送对象。
调用代码: 客户端B的session .getBasicRemote().sendText("发送的信息");
6. JavaSocket网络编程怎么实现不在同一个网络下通讯
如果你需要直接通讯,那么这是网管的事。不通的网络是没有办法的。
不过如果大家都接了互联网,那么可以通过中间服务器转发的方式进行通讯。服务器C在公网。那么客户端a连接C,客户端b也连接C,就可以实现转发。现在大规模的通讯基本都是这个方式。
7. 使用java socket怎么能够实现将一个客户端发送到服务端的消息转发到另一个客户端
用一个集合记住所有客户的Socket,收到数据包,就根据收发要求,转发
8. java socket服务器怎么给客户端发信息
服务器端和客户端都是通过SOCKET来进行通信的,首先产生一个
socket实例,通过这个实例,服务器端调用accept这个方法接收来自客户端发送的信息.但是在产生socket实例的时候必须初始化一个端口.用来负责接受客户端的请求!
客户端要给服务器发送消息也必须产生一个socket实例,初始化的时候必须指定服务器的IP地址,并且指定服务接收的端口号,这样客户端才能找到服务器要接收的地方,找到地方就可以发送过去了。和你写信一样。找到地址
BufferedReader
in
=
new
BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter
out
=
new
PrintWriter(socket.getOutputStream());
BufferedReader
wt
=
new
BufferedReader(new
InputStreamReader(System.in));
这个只是用来获取一个从键盘的一个流.传送给服务器端的数据都是通过流来表示的。意思是是键盘输入的一个字节转化成字符流.并输出或者写入!
9. JAVA怎么通过socket传输各种类型文件
IO
流的概念 什么叫流?
管道 -
流的分类
字节流 字符流
节点流 过滤流 (包装流 处理流 功能流)
输入流 输出流
InputStream抽象类 所有字节输入流统一的父类
OutputStream抽象类 所有字节输出流统一的父类
FileInputStream节点流 能够连接文件作为节点
int read() 无参read 一次读取一个字节 返回的就是字节数据
int read(byte[] data)*
int read(byte[] data,int off,int len)
FileOutputStream
构造方法:File Stringboolean append
*:输出流连接的文件会被自动创建出来 如果已存在那么替换
*:但是输出流连接的文件夹都不存在 直接Exception
write(int data)
write(byte[] data)
write(byte[] data,int off,int len)*
BufferedInputStream(节点输入流[,缓冲空间大小])
BufferedOutputStream(节点输出流[,缓冲空间大小])
*:它们是过滤流 包装流 处理流 它们只能连接节点流 不能直接连文件
使用它们俩是为了提供缓冲空间 从而大幅度的提高每次读写的
吞吐量 从而提高效率
*:Buffered 意味着有缓冲空间 一定要清空缓冲区
flush();
close();
*:一定注意 你可以使用的依然是read方法来实现读取 write 写出
read() read(byte[] data,int off,int len)
write(int data) write(byte data,int off,int len)
DataInputStream
DataOutputStream
*:它们是过滤刘 包装流 处理流 它们只能连接节点流 不能直接连文件
使用他们俩是为了提供读写基本数据类型内存原型的功能
readBoolean()readInt()readLong()
writeBoolean()writeInt()writeLong()
ObjectInputStream
ObjectOutputStream
*:它们是过滤刘 包装流 处理流 它们只能连接节点流 不能直接连文件
使用他们俩是为了能够提供对象持久化的功能
把Java当中不是基本数据类型的对象类型也能保存到文件中
implements Serializable
一个类型的对象如果想被持久化 那么这个类型必须序列化
而且当中所有的属性页必须实现序列化接口
如果是个集合概念 那么不但这个类型需要序列化
当中存放的任何一个元素都需要序列化
readObject()writeObject()
*:如果一个属性不需要参与持久化 那么可以直接把属性定义
为 transient 短暂的 转瞬即逝的
Reader抽象类 所有字符输入流统一的父类
Writer抽象类 所有字符输出流统一的父类
FileReader
int read() 无参read 一次读取一个字符 返回的就是字符数据
int read(char[] data)
int read(char[] data,int off,int len)
FileWriter
*:输出流连接的文件会被自动创建出来 如果已存在那么替换
*:但是输出流连接的文件夹都不存在 直接Exception
write(int data)
write(char[] data)
write(char[] data,int off,int len);
过滤流 包装流 处理流
BufferedReader
String readLine() 一次读取一行
字符串不能返回-1 返回null代表读取结束
BufferedWriter
write(String str) 写出字符串的方法
newLine() 写出一个换行标识
PrintStreamSystem.out
PrintWriter
太有魅力了 太强大了
1.可以连接字符流也可以连接字节流
2.可以当做节点流也可以当做过滤流
3.能够指定自动清空缓冲 (流,true) autoFlush
4.可以指定字符集 字符编码
5.一个println() = write()+newLine()
InputStreamReader
OutputStreamWriter
将原本的字节流包装转换成字符流
RandomAccessFilesetLength();
Socket
服务器 ServerSocket ss = new ServerSocket(7777);
while(true){
Socket s = ss.accept()
new XxxThread(s).start();
}
客户端 Socket socket = new Socket(ip,port);
getInputStream();
getOutputStream();