導航:首頁 > IDC知識 > java伺服器端socket

java伺服器端socket

發布時間:2020-12-11 22:34:47

1、java中用socket實現客戶端與服務端雙向連接問題

//服務端程序:
import java.io.*;
import java.net.*;

public class TCPServer {
public static void main(String[] args) throws IOException {
 TCPServer().init();
}
@SuppressWarnings("static-access")
private void init() throws IOException{
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(1000);
Socket client = null;
while(true){
try {
client = server.accept();
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
byte[] b = new byte[1024];
int len = 0;
String message = "";
while((len=bis.read(b))!=-1){
message = new String(b,0,len);
System.out.print("客戶端:"+client.getInetAddress().getLocalHost().getHostAddress()+"發來消息:" + message);
if("byte".equals(message.trim()))
client.close();
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
pw.println(message);
}
} catch (Exception e) {
System.err.println("客戶端:"+client.getInetAddress().getLocalHost().getHostAddress()+" 已斷開連接!");
}
}
}
}//客戶端程序:
import java.io.*;
import java.net.Socket;

public class TCPClient implements Runnable{
public static void main(String[] args) throws IOException {
new TCPClient().init();
}
private void init() throws IOException{
@SuppressWarnings("resource")
final Socket client = new Socket("127.0.0.1",1000);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String send = "";
while(true){
send = in.readLine();
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
if(!"byte".equals(send.trim()))
out.println(send);
else{
out.println(send);
System.exit(0);
}
new Thread(new TCPClient(){
@SuppressWarnings("static-access")
public void run(){
try {
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
byte[] b = new byte[1024];
int len = 0;
while((len=bis.read(b))!=-1){
System.out.println("伺服器:" +client.getInetAddress().getLocalHost().getHostAddress()+"發來消息:"+new String(b,0,len).trim());
}
} catch (IOException e) {
System.err.println("連接伺服器失敗!");
}
}
}).start();
}
}
public void run() {}
}

//伺服器測試結果:

客戶端:192.168.0.200發來消息:001 byte

客戶端:192.168.0.200發來消息:byte

客戶端:192.168.0.200 已斷開連接!

客戶端:192.168.0.200發來消息:adasd

客戶端:192.168.0.200 已斷開連接!

//客戶端測試結果:

---001號客戶端--

001 byte

伺服器:192.168.0.200發來消息:001 byte

byte //001禮貌說跟伺服器說byte

---002號客戶端--

adasd //002客戶端直接關閉程序

伺服器:192.168.0.200發來消息:adasd

2、java的伺服器端socket的accept()方法返回值為什麼是客戶端的socket類型

其實復不管是伺服器制還是客戶端都是使用的socket,接通之後伺服器會產生針對這個客戶端的一個socket,當有多個客戶端連接上去了,他們互不幹擾,是同類型不同的對象。伺服器和客戶端主要的區別就在這,客戶端是一個Socket,伺服器卻可以有很多個。每次當有新的客戶端連接是,伺服器會生成一個新的socket來響應,但是我不清楚Java中的伺服器是否自帶多線程,如果不自帶的話,想要程序並發的同時處理響應多個客戶端的連接,注意在獲取到Socket之後交給線程處理。

3、java 如何在伺服器端用socket創建一個監聽埠,並對接受的數據進行處理,埠號為3333,請高手指點一下

我百度HI你好了

public class Test {

public static void main(String[] args) {
Test1 t=new Test1();
t.start(); //啟動線程
}

}
/**
* 繼承一個線程類
* @author Administrator
*
*/
class Test1 extends Thread{
private ServerSocket server = null;
public Test1(){
try {
server=new ServerSocket(3333);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("服務端初始化失敗!");
}
}
/**
* 繼承父類方法
*/
public void run(){
Socket clientSocket = null;
DataInputStream dis =null;
DataOutputStream dos=null;
String str="";
while(true){
try {
clientSocket=server.accept();
dis = new DataInputStream(clientSocket.getInputStream());//獲取輸入流,用於接收客戶端發送來的數據
dos = new DataOutputStream(clientSocket.getOutputStream());//獲取輸出流,用於客戶端向伺服器端發送數據
str=dis.readUTF(); //這里是客戶端發送來的數據
/*
* 這里邊你就可以做你想操作的事情了
*/
dos.writeUTF("這里是返回到客戶端的數據");//這里用來向客戶端返回數據
dis.close();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

4、在java中如何用Socket 進行 伺服器端和客戶端交互的,具體一點。

打橫杠是因為那個方法已經過時了現在已經不怎麼用了。。。
Socket 伺服器: 1先創建 ServerSocket ss = new ServerSocket(埠號)

2 接收請求 Socket s = ss.accept()

3接收消息 先讀後寫BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream(),"utf-8"));
String str = in.readLine(); PrintWriter out = new PrintWriter
( new BufferedWriter( new OutputStreamWriter(s.getOutputStream())),true);
out.println("伺服器信息");

4關閉流out.close();
in.close();
is.close();

客戶端 1、通過IP地址和埠實例化Socket,請求連接伺服器
2、獲取Socket上的流以進行讀寫。
3、對流包裝進BufferedReader/PrintWriters實例
4、關閉打開的流

5、伺服器端是用java直接寫socket呢?還是用tomcat之類的呢?

不要重復造輪子,除非你寫的比tomcat更好。

6、Java中伺服器端ServerSocket對象怎麼獲取伺服器端地址和埠號??,怎麼獲取遠程請求的

ServerSocket s = new ServerSocket(8888);
while (true) {
// 建立連接
Socket socket = s.accept();

/ /getInetAddress()獲取遠程ip地址,getPort()遠程客戶端的斷後好
"你好,客戶端地址信息: " + socket.getInetAddress() + "\t客戶端通信埠號: " + socket.getPort()

7、編寫代碼,使用java ServerSocket創建伺服器端ServerSocket的過程。

伺服器端代碼:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public void server(){
        try {
            ServerSocket serverSocket = new ServerSocket(8888); //建立伺服器端的套接字,並監聽8888埠

            Socket socket = serverSocket.accept(); //如果有請求到達,則接受請求,並建立一個新的套接字
            InputStream is = socket.getInputStream(); //獲取此套接字上的輸入流,用於接收消息

            //接下來就是獲取套接字里的位元組流,並轉化為字元串
            byte[] bytes = new byte[1024];
            int count;
            StringBuilder sb = new StringBuilder();
            while((count = is.read(bytes)) != -1){
                sb.append(new String(bytes, 0, count));
            }

            is.close();
            System.out.println(sb.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Server s = new Server();
        s.server();
    }

}

另附客戶端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public void client(){
        try {
            Socket socket = new Socket(); //建立套接字
            socket.connect(new InetSocketAddress("127.0.0.1", 8888)); //連接到指定IP地址的主機,並指定埠號接收消息

            OutputStream os = socket.getOutputStream(); //獲取此連接上的輸出流,用於發送數據
            os.write(new String("Hello, world!").getBytes()); //將字元串轉化為位元組數組寫入輸出流
            os.flush();//刷新此輸出流,將位元組流寫入它們預期的目標
            os.close(); //關閉連接,否則會報連接重置異常
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Client c = new Client();
        c.client();
    }
}

8、java的客戶端用的是Socket,伺服器端用SocketChannel,這兩種能實現通信么? 說得比較白,望理解

Socket 和ServerSocke 是一對 他們是java.net下面實現socket通信的類
SocketChannel 和ServerSocketChannel是一對 他們是java.nio下面實現通信的類 支持版非同步通信

伺服器必權須先建立ServerSocket或者ServerSocketChannel 來等待客戶端的連接
客戶端必須建立相對應的Socket或者SocketChannel來與伺服器建立連接
伺服器接受到客戶端的連接受,再生成一個Socket或者SocketChannel與此客戶端通信

不過Socket和SocketChannel可以通過 socket.channel() SocketChannel.socket() 方法相互轉換
同理ServerSocket 和ServerSocketChannel 也可以相互轉換

9、java socket伺服器實現

下面是一個簡單的通訊的例子,來傳輸伺服器和客戶端之間傳輸文件。 。如果它是一個簡單的文本傳輸內容到文字的話來簡化操作了。 。 。

1伺服器

包sterning;

進口java.io.BufferedInputStream中;

進口java.io.DataInputStream中; 進口java.io.DataOutputStream中;

進口的java.io.File;

進口java.io.FileInputStream中;

進口java.net.ServerSocket的;

進口的java。 net.Socket;

公共類ServerTest {

整數埠= 8821;

無效啟動(){

插座S = NULL;

嘗試{

ServerSocket的SS =新的ServerSocket(埠);

而(真){

/ /選擇要

字元串文件路徑=傳輸的文件「D:\ \ lib中的RAR」;

文件FI =新的文件(文件路徑);

System.out.println(「文件長度:」+(int)的fi.length());

/ /公共套接字accept()方法拋出

/ / IOException異常監聽並接受此套接字連接。這種方法已經在連接之前被封鎖。

S = ss.accept();

System.out.println(「建立socket連接」);

數據輸入流DIS =新的數據輸入流(新的緩沖輸入流(S.的getInputStream()));

dis.readByte();

數據輸入流FIS =新的數據輸入流(新的緩沖輸入流(新文件輸入流(文件路徑)));

數據輸出流PS =新的數據輸出流(s.getOutputStream());

/ /文件名,長度到客戶端。要真的在這里適用所有平台,如處理中國的名字,但還需要進行處理,具體想想在Java第四屆你可以看到,有現成的代碼。

ps.writeUTF(fi.getName());

ps.flush();

ps.writeLong((長)fi.length());

ps.flush();

整型的bufferSize = 8192;

的byte [] buf中=新的位元組[的bufferSize];

而(真){

整數讀= 0;

如果{

閱讀= fis.read(BUF)(FIS = NULL!);

如果(讀== -1){

突破;

ps.write(BUF,0,讀);

ps.flush();

/ /注意關閉套接字連接哦,否則客戶端將等待數據伺服器過,

/ /直到套接字超時,導致數據不完整。

fis.close();

S.CLOSE();

System.out.println(「文件傳輸完畢」);

}趕上(例外五){

e.printStackTrace();

公共靜態無效的主要(字串ARG []){

新ServerTest()開始();。的使用率輔助類

包sterning

}

}

2。底座;

程序import java.net *;。

進口java.io. *;

公共類ClientSocket的{

私有String IP;

私人INT埠;

私人Socket套接字= NULL;

數據輸出流出來= NULL;

數據輸入流getMessageStream = NULL;

公共ClientSocket的(字元串的ip,詮釋埠){

this.ip = IP;

this.port =口;

/ *** / / **

*創建一個socket連接

*

* @拋出異常

*例外 BR /> * /

公共無效創建連接()拋出異常{嘗試{

插座=新的Socket(IP,埠);

}趕上(例外五){

e.printStackTrace();!

如果(插座= NULL)

socket.close();

扔é;

} {終於

}

}

公共無效的sendMessage(字元串的sendMessage)拋出異常{

嘗試{

出=新的數據輸出流( socket.getOutputStream());

如果(sendMessage.equals(「視窗」)){

out.writeByte(0X1);

了out.flush();

返回;

}

如果(sendMessage.equals(「UNIX」)){

out.writeByte(0X2);

了out.flush();

返回;

}

如果(sendMessage.equals(的「Linux」)){

out.writeByte(0x3的);

了out.flush();

}其他{

out.writeUTF(的sendMessage);

了out.flush();

趕上(例外五){

e.printStackTrace();

如果(!出= NULL)

out.close();

扔é;

} {終於

}

}

公開數據輸入流getMessageStream()拋出異常{

{

getMessageStream =新的數據輸入流(新緩沖輸入的嘗試(socket.getInputStream()));

返回getMessageStream;

}趕上(例外五){

e.printStackTrace();!

如果(getMessageStream = NULL)

getMessageStream.close();

扔é;

} {終於

}

}

公共無效shutDownConnection(){

嘗試{

如果(!出= NULL) out.close();

getMessageStream.close()(getMessageStream =空!);

如果(插座= NULL!)

socket.close();。

}趕上(例外五){

3客戶端

包sterning ;

進口java.io.BufferedOutputStream;

進口java.io.DataInputStream中;

進口java.io.DataOutputStream中;

進口java.io.FileOutputStream中;

公共類ClientTest {

私人ClientSocket的CS = NULL;

私人字元串的ip =「本地主機」;/ /設置伺服器IP

私人INT埠= 8821;

私人字元串的sendMessage =「Windwos下」;

公共ClientTest(){

{

嘗試,如果(創建連接()){

的sendMessage();

的getMessage();

}趕上(例外){

ex.printStackTrace();

私人布爾創建連接(){

CS =新ClientSocket的(IP,埠); 嘗試{

cs.CreateConnection();

System.out.print(「連接伺服器成功!」+「\ n」);

返回true;

}趕上(例外五){

System.out.print(「!無法連接到伺服器」+「\ n」);

返回false;

私人無效的sendMessage(){

如果(CS == NULL)

回報;

嘗試{

cs.sendMessage(的sendMessage);

}趕上(例外五){

System.out.print(「!發送消息失敗」+「\ n」);

私人無效的getMessage(){

如果(CS == NULL)

回報;

數據輸入流的InputStream = NULL;

嘗試{

的InputStream = cs.getMessageStream();

}趕上(例外五){

System.out.print(「接收消息緩沖區錯誤\ n」);

返回;

{

/ /本地保存路徑}

試試,文件名會自動從伺服器繼承。

字元串SAVEPATH =「E:\ \」;

整型的bufferSize = 8192;

的byte [] buf中=新的位元組[的bufferSize];

整數passedlen = 0; 長LEN = 0;

SAVEPATH + = inputStream.readUTF();

數據輸出流fileOut =新的數據輸出流(新的緩沖輸出流(newBufferedOutputStream(新文件輸出流(SAVEPATH)))); LEN = inputStream.readLong();

System.out.println(「文件的長度是:」+ LEN +「\ n」);

系統。通過out.println(「開始接收文件!」+「\ n」);

而(真){

整數讀= 0;

如果(inputStream! = NULL){

閱讀= inputStream.read(BUF);

passedlen + =讀;

如果(讀== -1){

突破;

/ /進度條,如果它要播放的文件,你可以重復列印出一些相同的百分比

System.out.println的( 「收到的文件」+(passedlen * 100 / LEN)+「%\ N」);

fileOut.write(BUF,0,讀);

System.out的。的println(「接收完成,將文件保存為」+ SAVEPATH +「\ n」);

fileOut.close();

}抓(例外五){

System.out.println(「收到錯誤消息」+「\ n」);

返回;

公共靜態無效的主要(字串ARG []){
新ClientTest();

10、java編程實現客戶端和伺服器端使用socket進行通訊的程序

Java中有一個專門用來建立Socket伺服器的類,名叫ServerSocket,可以用伺服器那麼多個客戶端如何實現呢?
其實,簡單的分析一下,就可以看出客戶和服務通訊

與java伺服器端socket相關的知識