这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢? 我爱电脑技术论坛; @1 @4 b& n: y5 x4 m1 h& v
* R: |* \; z6 F
% P1 K, c1 \( t$ y. l, Y我爱电脑技术论坛我爱电脑技术论坛8 I& S& v7 b9 n& L2 y. ^$ R: b+ _! W
其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器也会使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:
( F& e2 m3 ~) _+ `我爱电脑技术社区--打造最好的电脑技术自学交流平台www.520diannao.com9 G; m* Q! G5 @4 O; V& h. K
我爱电脑技术社区--打造最好的电脑技术自学交流平台# L, Q) ~5 e: Z5 E
我爱电脑技术论坛* i) Z# v( Y& d& }, R. @6 c
服务器: www.520diannao.com/ a6 r7 \4 e) p$ |7 R; P" c8 L8 l
我爱电脑技术社区--打造最好的电脑技术自学交流平台: M- q1 @; a$ T$ C a+ a
1 |2 F1 X. K& L/ i ~0 }2 S( N1 |2 m
import java.io.*;
6 d2 w0 S# \) [+ A我爱电脑技术社区--打造最好的电脑技术自学交流平台
$ _# l3 f [& L8 A我爱电脑技术社区--打造最好的电脑技术自学交流平台
" R, e" Q- i! F) {- Q) Uwww.520diannao.comimport java.net.*; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: O. O9 J2 ]/ G7 n
% |$ S& l8 B/ d& C我爱电脑技术论坛8 g9 d. R2 F; ^. J# k
: a* H6 ~) h2 v* dwww.520diannao.compublic class MyServer { www.520diannao.com6 s J3 p5 v6 D3 H& S! F% h+ g
0 K/ Q$ j8 S: t+ T; A我爱电脑技术论坛我爱电脑技术论坛4 J1 J3 |. X- {$ x7 }
public static void main(String[] args) throws IOException{
0 M3 M9 s/ f* v& l4 F7 v我爱电脑技术社区--打造最好的电脑技术自学交流平台
' `3 J1 d7 ^; L4 O我爱电脑技术论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 V# W3 l6 n) q( X& ^& }% A
ServerSocket server=new ServerSocket(5678);
4 }6 Y2 S5 k8 A* G+ l% e我爱电脑技术社区--打造最好的电脑技术自学交流平台www.520diannao.com$ L8 Q% U9 l1 o( L, @/ Q( e
5 j8 u- I6 t; F. D, L5 P打造最好的电脑自学交流论坛while(true){ 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( R" h& u& W. D. I/ M# s9 Y
* Q+ i5 o' W. k
5 Z! [$ k3 \, F; T. i" n; d+ Y, }$ {5 Mwww.520diannao.comSocket client=server.accept();
/ E: U9 ^: S0 S" X Z# F. m8 A1 f% wwww.520diannao.com3 A2 M) }& E1 u+ o' m0 L+ X9 w2 U4 [
4 A" }# R6 ] T2 Q9 qBufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 A. Z) K& ~4 K3 }! ~4 `: P) ~
+ }4 V- X- p" Y% L# R; q打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛# _4 {7 B" C' M) v! k, `) ?0 V' _
PrintWriter out=new PrintWriter(client.getOutputStream()); 我爱电脑技术社区--打造最好的电脑技术自学交流平台) b* ?) j' c9 Z# n- S% i. i
* p9 @% }9 @3 `& F& F6 P ` B我爱电脑技术论坛- S5 r, @0 ?0 i ]/ H
while(true){ 打造最好的电脑自学交流论坛7 d$ V# c3 \; c' S8 W
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 g) `( f# {8 T+ b. v9 [; Q" A
% f/ K5 I" c/ UString str=in.readLine();
7 W* L- @# M1 ?; a) t; k打造最好的电脑自学交流论坛www.520diannao.com) ]' w$ e! Y, i/ c
4 {& J. z1 @+ X( o8 M# h电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站System.out.println(str);
: h, F- j3 ?/ Wwww.520diannao.com
! _+ O3 V3 }/ z' F ]www.520diannao.comwww.520diannao.com+ O1 q) |. B4 R7 ~
out.println("has receive....");
' N2 c; A' C3 {: F0 j! z5 m- ?2 r$ W0 ]* y我爱电脑技术论坛
/ x. T9 a. s. F% m我爱电脑技术社区--打造最好的电脑技术自学交流平台
. ?- [) |, V( e8 Bout.flush();
; S0 m( n& i0 M' B- c& L5 h我爱电脑技术社区--打造最好的电脑技术自学交流平台
8 b4 e' v: _1 Q# T' cwww.520diannao.com
' O; h" V0 A! R+ H( G; S我爱电脑技术社区--打造最好的电脑技术自学交流平台if(str.equals("end")) 打造最好的电脑自学交流论坛& {. }# M o; i% X# T
& r* T; m" x% o8 u- I% r打造最好的电脑自学交流论坛2 x) \" V) C' A9 n5 s
break; 6 X) m8 X" n1 @
3 R5 y: ^6 b8 r6 G7 U我爱电脑技术社区--打造最好的电脑技术自学交流平台打造最好的电脑自学交流论坛6 C6 c) t/ _8 i# r9 l: \8 P
}
7 l& b' F1 W# R/ L0 z- Lwww.520diannao.com$ s) t1 X) u# X6 a4 S* g
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站$ ?, h: N$ s& C6 _! |( v( B
client.close();
2 ~+ `5 I3 H0 W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站) n9 U" H) L5 ~: I9 X1 _2 V
8 `1 \) |% J6 u* ]& B; j3 ^电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站} 我爱电脑技术论坛) m2 ~5 s6 i( x
: J& k: M$ E+ @" A; ]www.520diannao.com8 i5 @* w+ e5 `
} www.520diannao.com. i; [+ L- L2 ~ k& ?
* g2 v9 y1 M/ a! l+ \& D) o W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 S) F% N9 N( {0 Q' f( ^3 q
} 打造最好的电脑自学交流论坛+ M; k" `0 i; A, F5 e8 r
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站* y% d) Q$ q0 X, \
打造最好的电脑自学交流论坛, {- Z9 D, F5 F& P+ T
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: Y( |0 i: p# j' H4 I
这里仅仅只是加了一个外层的While循环.这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了.所以线程是最好的解决方案. www.520diannao.com/ G& `; E% _: y9 B2 G! D5 j8 I3 O
?, K9 |+ M: l, S- L* Z1 s电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站0 \& u) u, s" [" o6 X* u) I
那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系.然后由线程来执行刚才的操作.要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法.而run方法所做的事情.就是刚才单线程版本main所做的事情.因此我们的程序变成了这样: % H+ t8 l- X7 U' F4 X5 ?$ ~! a
( D+ L9 K$ @; y/ ?# L我爱电脑技术论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台3 u* O. Z4 a+ x+ {0 l4 a4 o
import java.net.*;
; c( t7 l8 \7 T' Z+ q我爱电脑技术社区--打造最好的电脑技术自学交流平台
8 `& a9 j D" F9 E: f( ~" j/ q我爱电脑技术论坛
# E9 H; E8 Z9 U+ X( V0 n我爱电脑技术社区--打造最好的电脑技术自学交流平台import java.io.*; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站# K4 f$ @( R! I: q: ~ x
# {6 R, u' l$ ~2 N/ J我爱电脑技术社区--打造最好的电脑技术自学交流平台
: l$ \( f1 ]' E9 d" m( l% S我爱电脑技术论坛
% J3 k) u0 h& n电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站public class MultiUser extends Thread{
6 S2 L- F7 q( a0 N7 Y; C, b电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
* u& p3 n+ ]- E4 r& l7 d$ mwww.520diannao.comwww.520diannao.com- i$ O7 R4 _8 ]$ A8 ^9 B, b
private Socket client;
$ F9 d" m; d; S4 ~4 V: mwww.520diannao.com
- d W) C6 f0 J7 o/ }5 f) ~打造最好的电脑自学交流论坛
% o* [% y; i( X* n$ Z* j电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
1 k; p, X w0 Bpublic MultiUser(Socket c){ 我爱电脑技术社区--打造最好的电脑技术自学交流平台" J& @( x' F# J
" z9 n' D2 C, T/ H7 ~2 C" Z
9 `6 O9 A& r( o# D3 j2 E我爱电脑技术论坛this.client=c; 我爱电脑技术社区--打造最好的电脑技术自学交流平台$ |5 D+ Y: ~$ c" R. V. S/ `( `
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- x3 I( h+ B' c
- F/ k2 v+ _6 N4 [
} 我爱电脑技术社区--打造最好的电脑技术自学交流平台9 D6 Z5 D, I+ Y3 I, X& B
打造最好的电脑自学交流论坛7 s8 r" I4 h) d* Z% B; n/ a7 [. n% R
7 L+ o Y4 |- F/ T, f0 X我爱电脑技术社区--打造最好的电脑技术自学交流平台
5 p9 M2 x, m& u6 V! c3 E! Q9 |我爱电脑技术论坛public void run(){ 4 m; l4 u! }! \) m
1 W' m2 [; j# v- F, B1 |www.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站. r) R8 `' u# u. ~+ x# t
try{
3 Z* }! C5 S- r$ X+ N8 U! z, V
" j9 H- p% Z7 y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
9 ~ a1 f1 C* q4 k8 a8 |; Kwww.520diannao.comBufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 我爱电脑技术社区--打造最好的电脑技术自学交流平台* W) \+ K; M" t2 y+ k5 O" h
我爱电脑技术论坛' ~4 N7 ?5 d. B
- N: u* Y* L8 o( ~. g& n+ f/ N打造最好的电脑自学交流论坛PrintWriter out=new PrintWriter(client.getOutputStream()); 我爱电脑技术社区--打造最好的电脑技术自学交流平台' L n1 `3 J' Z: r7 i* _6 u( `
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 z; x. z F; H# i8 F
7 w6 l/ R' u( o0 S# y9 h. o8 M电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站//Mutil User but can't parallel ( |6 r1 P. d. {
我爱电脑技术论坛* w( y& {, N t" S
打造最好的电脑自学交流论坛8 V$ @' u ^; T# Y' w1 D( T% q. V& g
while(true){ www.520diannao.com, Y7 ]# s' F) ?# ~- n& X
www.520diannao.com) j4 U/ T: U1 j7 L# u
, a/ X# P ^8 I/ r# k我爱电脑技术论坛String str=in.readLine(); www.520diannao.com) O, j3 b+ g% G, N# ]" [, X! q
: z1 _2 K2 s$ e
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 E$ _0 C$ M6 {% b- V& M. v
System.out.println(str); 4 b9 h7 e9 ~! |" Y
( [3 ?, R% i- c/ n2 u! K- O6 ^www.520diannao.com
v6 m' B; l8 L) Bout.println("has receive....");
" T4 e5 k t; J4 z电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术论坛! b) ?0 n3 P: X) S6 ~
# G3 e5 y- [! X6 n打造最好的电脑自学交流论坛out.flush();
0 b$ u- O2 \. Y+ U5 T `www.520diannao.com
/ O5 Q0 v0 O$ n' g, e& J) ]打造最好的电脑自学交流论坛# V6 J4 X* s8 o2 M! L
if(str.equals("end"))
* E2 h6 x# i8 X# ^) w$ I
% e- I) f5 m& A7 g7 v* t9 |0 N; P$ {我爱电脑技术论坛
) N3 D {1 |1 ^5 I7 ], k打造最好的电脑自学交流论坛break; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站& K& ?! b0 F$ G, U$ u. ]
. M# m- V& l5 u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 e/ u* J0 A! `, z3 O
} 打造最好的电脑自学交流论坛* W5 }# f: O! j9 r" ?
打造最好的电脑自学交流论坛" O6 ^ L$ T' g! r6 l
) f. x, z5 Q W+ k7 |我爱电脑技术社区--打造最好的电脑技术自学交流平台client.close(); 我爱电脑技术论坛0 W( O5 s J2 C3 W
* k! ] E, y' l* e6 J6 a4 r6 ^ nwww.520diannao.comwww.520diannao.com& i" l& q& \5 a+ ~, o6 G! ?7 E
}catch(IOException ex){ 我爱电脑技术论坛6 P; g4 Z" S' Z2 {2 g4 Z
. ~( ]+ C- _, I& `& J
5 S9 r2 I2 e+ p电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站}finally{ 我爱电脑技术社区--打造最好的电脑技术自学交流平台( S8 L+ D' D& l5 _0 S# E }! l L* E, F& k8 s
我爱电脑技术社区--打造最好的电脑技术自学交流平台/ U. h1 f; |* G0 U
我爱电脑技术社区--打造最好的电脑技术自学交流平台0 j5 {- l! }8 T! l. {' w0 W' z
+ G6 s' s5 v4 g1 { K
}
/ v' Y' I5 \& A- h4 `$ I5 f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛# h5 ~( ^! Q8 m* ^" v
0 I) a' V' {8 @5 m, L# X4 T9 }打造最好的电脑自学交流论坛}
( ^0 ~# E1 A/ L- x6 h8 c$ ~( F电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术论坛6 M4 R# I& ^. x) A
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站! O5 _5 O/ o6 R) S# H5 Y
% O1 K5 p5 }3 m$ k3 P打造最好的电脑自学交流论坛public static void main(String[] args)throws IOException{
, g; G n( X% `7 u- o& ywww.520diannao.com我爱电脑技术论坛4 E2 r6 f) E6 s8 c6 |) ]9 n; z
& b/ i, K1 X2 N" v% u- d; F. o( U+ h3 u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站ServerSocket server=new ServerSocket(5678); 我爱电脑技术论坛( X+ Z8 A, O* G0 @3 {1 T
我爱电脑技术社区--打造最好的电脑技术自学交流平台, S& f2 `! ]0 h# C0 Y
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 \2 t" Y6 z8 H; |3 s
while(true){
3 x: |0 O4 B" W/ |! bwww.520diannao.com我爱电脑技术论坛, S- }0 S5 M: h* q+ `$ Z# T
www.520diannao.com; b5 `! B/ N; r l
//transfer location change Single User or Multi User 我爱电脑技术社区--打造最好的电脑技术自学交流平台- H1 O0 Q0 ], z2 z
. A7 y( O3 H9 j电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
+ ?! l8 D6 C# d# E1 ?- L0 t- f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站MultiUser mu=new MultiUser(server.accept()); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- B2 O2 b. ] G4 Y, g& M
www.520diannao.com& z' S0 k$ x& t
! d; L! q. ^; W V2 K- e8 U
mu.start(); 打造最好的电脑自学交流论坛7 p% |8 V* r2 I P
$ }: d7 k8 u5 @1 X6 J, W8 p* `我爱电脑技术论坛# R7 V; U7 `# G. U5 l4 n( M
} 我爱电脑技术论坛; D o/ V% L( n
我爱电脑技术社区--打造最好的电脑技术自学交流平台, [) l$ z4 U7 V# v. s" B) H6 p( I
% y) \7 h4 {5 B) a我爱电脑技术社区--打造最好的电脑技术自学交流平台} 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站; Z' x) {2 T" p6 k& o5 L. _+ P
( c8 ]- P, R; t我爱电脑技术论坛我爱电脑技术论坛6 o2 n; l! c" r* R2 P2 Y
}
# V0 n9 u- K6 z4 i1 t我爱电脑技术社区--打造最好的电脑技术自学交流平台. G0 L0 T( d" I7 [" B- \1 Z
& Y0 e. l8 L- {2 g/ y- P5 x
* M- s! O8 q a5 n& [9 n9 L
我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系.这样每个线程就有了.一个通讯管道.同样我们可以填写run方法.把之前的操作交给线程来完成.这样多客户并行的Socket就建立起来了.