1. 程式人生 > >Java Socket實現客戶端服務端相互發送文字

Java Socket實現客戶端服務端相互發送文字

Socket是網路程式設計的介面,它抽象成執行緒之間的介面。兩個執行緒,不管它的作業系統,不管它的硬體,只要有Socket介面,在同一主機中或者在不同的主機中都能通訊。我們見到的大大小小的網路程式大多都是通過Socket實現的,比如遊戲伺服器,ftp伺服器,瀏覽器等。所以理解Socket程式設計,是網路程式設計的的必修課。在本篇文章中我們將講到用Socket實現簡單的服務端與客戶端互相傳送純文字的例子。


在Socket程式設計中一端作為服務端,一端作為客戶端才能通訊。

服務端與客戶端的區別:服務端要與它連線的所有客戶端通訊,而客戶端只與指定的一個服務端通訊。

在通訊前,服務端先指定一個埠,然後就可以等待客戶端的連線。

客戶端要想連線上服務端,必須知道服務端的ip地址和埠,ip地址指明瞭服務端的位置,而埠指明瞭是哪一個服務端。

當客戶端與服務端連線上之後,如何通訊呢。在服務端,要想給客戶端傳輸資料,就先得到客戶端的例項,然後對該例項進行IO操作,就相當與操作自己的檔案系統一樣,非常的方便,所以說Socket是抽象的概念,把資料傳輸抽象成資料的讀寫。當服務端對客戶端的例項進行寫的操作時客戶端就可以收到服務端寫的資料;當客戶端對服務端的例項進行寫的操作時,服務端就能收到客戶端傳輸過來的資料;

在Java中服務端中:

ServerSocket(int port)建構函式繫結一個埠。

 Socket accept()  方法監聽客戶端的連線,該方法返回一個Socket物件。

在Java中客戶端中:

Socket(InetAddress address, int port)建構函式構造一個socket物件。

connect(SocketAddress endpoint) 連線到服務端。

服務端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		runServer();
	}

	
	private static void runServer() throws IOException {
		ServerSocket ss=new ServerSocket(3574);//服務端監聽3574這個埠
		Socket s=ss.accept();//服務端接受客戶端的連線
		System.out.println(s.getLocalSocketAddress().toString());
		InputStream in=s.getInputStream();//得到客戶端的輸入流,為了得到客戶端傳來的資料
		OutputStream out =s.getOutputStream();//得到客戶端的輸出流,為了向客戶端輸出資料
		BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(in));
		PrintWriter bufferedWriter=new PrintWriter(out,true);

		while (true) {

			String line=null;
			bufferedWriter.println(new Date()+",Hello,I'm Server!");//向客戶端輸出資料
			line=bufferedReader.readLine();//讀取客戶端傳來的資料
			if(line==null)
				break;
			System.out.println("客戶端說:"+line);//列印客戶端傳來的資料

		}
	}
}

客戶端:

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.io.*;
import java.util.*;
import java.net.*;

public class Main
{

	public static void main(String[] args) throws UnknownHostException, IOException
	{
		runSocket();
		
	}
	private static void runSocket() throws IOException
	{
		final String HOST="192.168.1.100";
		//final String HOST="127.0.0.1";
		Socket socket = new Socket(HOST, 3574);//建立一個客戶端連線
		OutputStream out = socket.getOutputStream();//獲取服務端的輸出流,為了向服務端輸出資料
		InputStream in=socket.getInputStream();//獲取服務端的輸入流,為了獲取服務端輸入的資料

		PrintWriter bufw=new PrintWriter(out,true);
		BufferedReader bufr=new BufferedReader(new InputStreamReader(in));
		while (true) 
		{
			String line=null;
			line=bufr.readLine();//讀取服務端傳來的資料
			if(line==null)
				break;
			System.out.println("服務端說:"+line);//列印服務端傳來的資料
			bufw.println((new Date()) + ",Hello,I am Client!");//傳送資料給服務端

		}
	}
	
}
轉載自:https://blog.csdn.net/e_one/article/details/51620620