要完成一个java服务器,要求一个客户端能通过服务器向别的客户端发送“hello”,也能接收“hello”
import .*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Client1 extends Frame implements Runnable{
Socket socket;
BufferedReader in;
PrintWriter out;
private TextField textfield = new TextField();//输入文本框 就是你想从键盘输入的数据先写在这
private TextArea textarea = new TextArea();//对话框 显示客户端之间的聊天信息
public Client1() {
super("聊天窗口");//初始化窗口标题
setSize(300,200);//设置窗口大小
setLayout(new BorderLayout());//布局
add(BorderLayout.SOUTH, textfield);
add(BorderLayout.CENTER, textarea);
textfield.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendChat(textfield.getText());//向服务器发送数据
}
});//增加监听器 当你按下回车键时就执行
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
try{
if(in!=null)in.close();
if(out!=null)out.close();
if(socket!=null)socket.close();
}catch(IOException e){
}
System.exit(0);//退出程序
}
});//增加关闭窗口的监听器 当点击窗口的X时关闭窗口
try{
socket = new Socket("localhost", 3333);
out = new PrintWriter(socket.getOutputStream(), true);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch(Exception e){
e.printStackTrace();
}
new Thread(this).start();//用一个线程去接收从服务器转发的其他客户端的数据
setVisible(true);
}
//sendChat方法用于向服务器发送数据
public void sendChat(String message) {
out.println(message);
textfield.setText("");//输入框清空
}
public void run(){
String message=null;
try {
while (true) {
message = in.readLine();
textarea.append(message + "
");//把从服务器转发来的其他客户端信息追加到对话框
}
} catch (IOException e) {System.out.println(e);}
}
public static void main(String[] args) {
new Client1();
}
}
什么是套接字(socket)
套接字(socket)是用于网络通信的基本操作单元。
简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
套接字可以根据通信性质分类,主要分 流式套接字(SOCK_STREAM), 数据报套接字(SOCK_DGRAM)以及原始套接字(SOCK_RAW).
数据报套接字提供了一种不可靠的、非连接的数据包通信方式。
所以 数据报套接字使用UDP协议,当然,winsock 2版本还支持其他协议。
手机作为客户端,电脑作为服务器进行android socket通信
1.PC服务器启用ServerSocket两个通信实体在建立虚拟链路之前,需要有一方先准备好,主动接受来自其他通信实体的连接请求。
使用ServerSocket对象监听来自客户端的Socket连接。
//创建ServerSocket对象ServerSocketss=newServerSocket(30000);//监听来自客户端的请求while(true){Sockets=ept();…}如果没有连接,则将一直处于等待状态。
当接收到连接请求后,获取消息到输入流,并保存到文件。
//接收客户端消息BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));Stringstr;BufferedWriterbw=newBufferedWriter(newFileWriter("D:/ApInfo"+(i++)+".txt"));while((str=in.readLine())!=null){System.out.println(str);bw.write(str);bw.newLine();}2.Android终端使用Socket通信客户端使用Socket的构造器连接服务器,指定服务器IP和端口号就可以了。
Sockets=newSocket(“192.168.1.100”,30000);这样服务器端的ept()方法就得到响应,从而向下执行,服务器端和客户端就形成了一对互相连接的Socket。
再进行通信时就没有服务器和客户端之分了,都是通过输入输出流进行通信。
详细步骤:采用Handler和TimerTask来定时扫描AP信息并发送给服务器端。
TimerTask规定了到达指定的时间所要进行的任务。
TimerTasktask=newTimerTask(){publicvoidrun(){Messagemessage=newMessage();message.what=1;handler.sendMessage(message);}};handler传递message内容:Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){switch(msg.what){case1://执行定时器时间到了之后由handler传递的任务break;}super.handleMessage(msg);}}接下来扫描AP信息并发送给服务器端,然后将结果保存。
WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE);wifiManager.startScan();mWifiList=wifiManager.getScanResults();由WifiManager说明可知,它可以用于处理已配置的网络,当前连接的网络及AP信息的扫描等情况。
向服务器发送消息:socket=newSocket("192.168.1.211",30000);//向服务器端发送消息PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);out.println(message);其中message为获取的AP信息,测试收到的信息格式为:SSID:ICIS_LAB,BSSID:1c:af:f7:9a:65:e4,capabilities:[WPA-PSK-TKIP+CCMP],level:-80,frequency:2437
一个聊天程序 求大神指点
给个简单的客户端的例子,lz对比自己的码看看有什么出入 (注意:ClientHandler是inner class)
package chap15;
import java.io.*;
import .*;
import java.util.*;
public class VerySimpleChatServer
{
ArrayList clientOutputStreams;
public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSOcket) {
try {
sock = clientSOcket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch (Exception ex) { ex.printStackTrace(); }
}
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read " + message);
tellEveryone(message);
}
} catch (Exception ex) { ex.printStackTrace(); }
}
}
public static void main(String[] args) {
new VerySimpleChatServer().go();
}
public void go() {
clientOutputStreams = new ArrayList();
try {
ServerSocket serverSock = new ServerSocket(5000);
while(true) {
Socket clientSocket = ept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got a connection");
}
} catch (Exception ex) { ex.printStackTrace(); }
}
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while (it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
} catch (Exception ex) { ex.printStackTrace(); }
}
}
}
ios socket和xmpp哪个好
socket是套接字,在你的语境下,多指传输层网络接口。
webSocket,是一个应用层协议,说的是,目前浏览器实现的一套通信协议,用来解决之前HTTP,请求响应模型不合适的场合。
XMPP,是一个应用层协议,协议基于XML结构设计。
其实websocket是socket的简约实现,与socket相比,可以节省额外的端口占用,直接使用一个公网域名访问。
另外协议对报文的流量消耗做了优化。
xmpp与websocket比也是比较臃肿的
xmpp是im的使用比较广泛的协议,早期的手机端推送为了省事就用的这种协议,但是后来发现这种协议比较臃肿耗流量,而且对服务器要求比较高