欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
用java进行网络编程确实很方便,很容易上手。这几天用java进行socket编程,收获不少。
首先,进行服务端的编程,作为服务端,编程主要按下面几个步骤进行:
// 1. 创建socket ServerSocket ss = new ServerSocket(PortNumber); Socket s = ss.accept(); //监听器,产生阻塞,直到有连接才停止阻塞。
// 2. 打开输入流、输出流 OutputStream os = s.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(os); InputStream is = s.getInputStream();
// 3. 根据一定的协议读写数据 // 服务器 –> 客户 //os.write(“Hello,I am Server!”.getBytes()); bos.write(“Hello,I am Server!”.getBytes()); bos.flush(); //注意!!
// 服务器 <– 客户 byte[] buf = new byte[100]; int len = is.read(buf); System.out.println(new String(buf, 0, len));
// 4. 关系流和Socket //os.close(); bos.close(); is.close(); s.close(); ss.close();
作为客户端则分为下面几个步骤,其实和服务端差不多,只是少了用ServerSocket进行监听。
// 1. 创建socket Socket s = new Socket(InetAddress.getByName(“localhost”), PortNumber); // 2. 打开输入流、输出流 OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream();
// 3. 根据一定的协议读写数据 // 服务器 –> 客户 byte[] buf = new byte[100]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); // 服务器 <– 客户 os.write(“Hello,I am Client!”.getBytes());
// 4. 关系流和Socket os.close(); is.close(); s.close();
上面这些只是一个单线程的服务端->客户端的程序,只能进行一次通讯,多次通讯将被告知无法连接。
这时,我们就需要用到进程Thread进行编程,将其改造成多线程聊天程序,可以同时进行多客户端的连接与发送信息。
代码如下:
//Server.java
import java.awt.*; import java.net.*; import java.io.*;
public class Server extends Thread { ServerSocket skt;
Socket Client[]=new Socket[10];; Socket Client1=null;
int i = 0;
TextArea in;
int port,k=0,l=0;
//BufferedReader theInputStream;
PrintStream theOutputStream;
//String readin;
Face chat;
public Server(int port, Face chat) { try { this.port = port; skt = new ServerSocket(port); this.chat = chat; } catch (IOException e) { chat.ta.append(e.toString()); } }
public void run() {
chat.ta.append(“等待连线……”);
while (true) { //System.out.print(“”+i+”\n”); try {
Client[k] = skt.accept(); /* 接收客户连接 */
//当有客户端连接时就新建一个子线程
if (i < 2) { ServerThread server[] = new ServerThread[10]; server[k]= new ServerThread(Client[k], this.chat, i); l=server.length; server[k].start(); chat.ta.append(“客户端” + Client[k].getInetAddress() + “已连线\n”); /*theInputStream = new BufferedReader(new InputStreamReader(Client .getInputStream()));*/ //for(int j=0;j<server.length;j++) theOutputStream = new PrintStream(server[k].getClient().getOutputStream()); i = server[k].getI(); k++; } else { //theOutputStream = new PrintStream(null); }
} catch (SocketException e) { //chat.ta.append(“连线中断!\n”);
//chat.clientBtn.setEnabled(true); //chat.serverBtn.setEnabled(true); //chat.tfaddress.setEnabled(true); //chat.tfport.setEnabled(true); //try {
//skt.close(); //Client.close(); //} catch (IOException err) { // chat.ta.append(err.toString()); //} } catch (IOException e) { chat.ta.append(e.toString()); } }
}
public void dataout(String data) { //for(int j=0;j<l;j++) theOutputStream.println(data); } }
class ServerThread extends Thread { ServerSocket skt;
Socket Client;
TextArea in;
int port;
int i;
BufferedReader theInputStream;
PrintStream theOutputStream;
String readin;
Face chat;
[1][2][3]
人生的路无需苛求。只要你迈步,路就在你的脚下延伸。