您的位置:首页 > 其它

用Socket实现程序之间的交互(通信)

2014-09-23 13:42 204 查看
一  实现一对一服务器向客户端单向传输数据服务器端代码
</pre><pre name="code" class="java">
</pre>客户端代码<p></p><p></p><pre name="code" class="java" style="font-size:14px;">import java.io.*;
import java.net.Socket;
public class MyDemo {
public static void main(String []args) throws Exception{
//连接服务器172.20.4.56是要链接的服务器的地址
Socket socket=new Socket("172.20.4.56", 10010);
//new ThreadDemo(socket).start();
//System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,
//然后再使用BufferedReader为其增加缓冲功能(控制台的数据会先写到缓存中)
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
////PrintWriter是带格式的输出流,是字符流的一种,特别适合网络中字符数据的发送
//因为这个流的最大特点是自动刷新缓存,而不需要我们手动刷新
//而是每次遇到回车换行的时候自动刷新缓存,发送信息
//另外这个流还有个小特点,就是在执行过程中即使出现了异常也不会报出来,而是直接压制在这个流的内部
PrintWriter out=new PrintWriter(socket.getOutputStream(), true);
//BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//输入信息到服务器
while(true){
String msg=br.readLine();
//很奇怪的写法,注意不是System.out.println,不过概念差不多
//只不过这里是输出到了服务器而已,println都是表示输出后换行
out.println("客户端:"+msg);//输出到服务器
}}}
二  实现一对一服务器和客户端双向通信因为客户端和服务器端同时进行收发两个操作,所以要采用线程服务器端代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;//服务器端的Socket类,其对象表示一个具体的服务器程序
import java.net.Socket;//客户端的Socket,其对象表示一个具体的客户端程序
import java.util.ArrayList;
//服务器程序可以通过Socket实现于其对应的客户端进行沟通和传输

//服务器程序
public class Demo {
public static void main(String[]args)throws Exception {
//创建服务器Socket对象,同时指定当前服务器程序的标识端口(范围65535之内的整数都可以)
ServerSocket server=new ServerSocket(10010);
System.out.println("服务器已经启动");
//等待客户端连接,如果客户端没有来,那么程序会在accept()处阻塞(等待状态,不继续后续语句)
//而如果客户端连接到了,那么accept会返回代表客户端的Scoket对象
System.out.println("等待客户连接...");
Socket client=server.accept();
new MyThread(client).start();
//服务器数据发送
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(client.getOutputStream(),true);
while(true){
String inputMsg=br.readLine();
out.println("服务器:"+inputMsg);
}
}
}

class MyThread extends Thread{
Socket client;
public MyThread(Socket client){
this.client=client;
}

public void run(){
try{
//客户端的数据读取
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
String msg=in.readLine();
System.out.println(msg);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端代码
import java.net.Socket;
import java.io.*;
//客户端
public class Demo {
public static void main(String[]args)throws Exception{
//连接服务器
Socket socket=new Socket("172.20.4.56", 10010);
//然后通过连接到服务器的socket对象进行数据传输和操作.....
new MyThread(socket).start();
//向服务器发送信息
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(socket.getOutputStream(), true);
while(true){
String msg=br.readLine();
out.println("客户端:"+msg);
}
}
}

class MyThread extends Thread{
Socket client;
public MyThread(Socket client){
this.client=client;
}

public void run(){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
String msg=in.readLine();
System.out.println(msg);
}
}catch(Exception e){
e.printStackTrace();
}
}
实现一对多服务器向多个客户端发送数据一个客户向服务器发送数据,服务器再将这个数据发送给其他客户端服务器端代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
//服务器程序可以通过Socket实现于其对应的客户端进行沟通和传输

//服务器程序
public class Demo {
public static void main(String[]args)throws Exception {
//创建服务器Socket对象,同时指定当前服务器程序的标识端口(范围65535之内的整数都可以)
ServerSocket server=new ServerSocket(10010);
System.out.println("服务器已经启动");
//等待客户端连接,如果客户端没有来,那么程序会在accept()处阻塞(等待状态,不继续后续语句)
//而如果客户端连接到了,那么accept会返回代表客户端的Scoket对象
System.out.println("等待客户连接...");
ArrayList clients=new ArrayList();
while(true){
Socket client=server.accept();
clients.add(client);
new MyTask(client,clients).start();
}
}
}

class MyTask extends Thread{
private Socket client;
private ArrayList clients;
public MyTask(Socket client,ArrayList clients){
this.client=client;
this.clients=clients;
}
public void run(){
try{
//接收当前客户端发送的信息
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
String msg=in.readLine();
//转发给其他客户端
for(int i=0;i<clients.size();i++){
Socket s=(Socket)clients.get(i);
if(client==s){
continue;
}
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println(msg);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}

class MyThread extends Thread{
Socket client;
public MyThread(Socket client){
this.client=client;
}

public void run(){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
String msg=in.readLine();
System.out.println(msg);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端代码(继续使用第二个的代码也可以,这里多加了昵称等,以便区分是哪个客户端发送的)
import java.net.Socket;import java.io.*;public class Demo {public static void main(String[]args)throws Exception{Socket socket=new Socket("172.20.4.95", 10086);BufferedReader br=new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入昵称:");String name=br.readLine();new MyThread(socket).start();PrintWriter out=new PrintWriter(socket.getOutputStream(), true);while(true){String msg=br.readLine();out.println(name+":"+msg);}}}class MyThread extends Thread{Socket client;public MyThread(Socket client){this.client=client;}public void run(){try{BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));while(true){String msg=in.readLine();System.out.println(msg);}}catch(Exception e){e.printStackTrace();}}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: