Java - Stream, Network

|

 

package Week03.day0723;

import java.util.ArrayList;
import java.util.Collections;

class Customer<T extends Order> implements Comparable<Customer>{ //order를 포함한 하위에 대해서만 선언가능.(special도 가능)
	private String name;
	private int age;
	private int point;
	private ArrayList<T> orders = new ArrayList<>();
	
	Customer(String name, int age, int point) {
		this.name = name;
		this.age = age;
		this.point = point;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}

	public ArrayList<T> getOrders() {
		return orders;
	}

	public void addOrders(T order) {
		this.orders.add(order);
	}
	
	@Override
	public int compareTo(Customer o) { // Point로 Customer 정렬, SpecialCustomer는 bonus를 더해준다 //customer로 해야인식가능(아니면 object로 인식)
		System.out.println("비교 - Customer: " + this.name);
		int thisToPoint = point;
		int paramToPoint = 0;
		
		if(o instanceof SpecialCustomer) {
			paramToPoint = o.getPoint() + ((SpecialCustomer)o).getBonusPoint();
		} else {
			paramToPoint = o.getPoint();
		}
		
			//Comparator 방법 적용
			// 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수 리턴
		    // 첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴
			// 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수 리턴
			//음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경된다.
			if(thisToPoint < paramToPoint) {
				return -1;
			} else if (thisToPoint > paramToPoint) {
				return 1;
			}
			return 0;
	}
	
	public String toString() { // point만 출력
		return name + "/" + point;
	}
	
}

class SpecialCustomer<T extends SpecialOrder> extends Customer<T>{
	private int bonusPoint;
	
	public SpecialCustomer(String name, int age, int point, int bonuspoint) {
		super(name, age, point);
		this.bonusPoint = bonuspoint;
	}

	public int getBonusPoint() {
		return bonusPoint;
	}

	public void setBonusPoint(int bonusPoint) {
		this.bonusPoint = bonusPoint;
	}
	
	public int compareTo(Customer o) {
		System.out.println("비교 - SpecialCustomer: " + super.getName());
		int thisToPoint = super.getPoint() + bonusPoint;
		int paramToPoint = 0;
		
		if(o instanceof SpecialCustomer) {
			paramToPoint = o.getPoint() + ((SpecialCustomer)o).getBonusPoint();
		} else {
			paramToPoint = o.getPoint();
		}
		
			if(thisToPoint < paramToPoint) {
				return -1;
			} else if (thisToPoint > paramToPoint) {
				return 1;
			}
			return 0;
	}
	
	public String toString() { // bonuspoint 합쳐진거 출력.
		return super.getName() + "/" + (super.getPoint() + bonusPoint);
	}
	

}

class Order{
	private int orderNo;
	private String product;
	private String orderDt;
	
	public Order(int orderNo, String product, String orderDt) {
		this.orderNo = orderNo;
		this.product = product;
		this.orderDt = orderDt;
	}
	
	public int getOrderNo() {
		return orderNo;
	}

	public void setOrderNo(int orderNo) {
		this.orderNo = orderNo;
	}

	public String getProduct() {
		return product;
	}

	public void setProduct(String product) {
		this.product = product;
	}

	public String getOrderDt() {
		return orderDt;
	}

	public void setOrderDt(String orderDt) {
		this.orderDt = orderDt;
	}
	
}

class SpecialOrder extends Order{
	private String gift; // 사은품
	
	public SpecialOrder(int orderNo, String product, String orderDt, String gift) {
		super(orderNo, product, orderDt);
		this.gift = gift;
	}

	public String getGift() {
		return gift;
	}

	public void setGift(String gift) {
		this.gift = gift;
	}
	
	
}

public class practice0723 {

	public static void main(String[] args) {
		
		Customer<Order> c1 = new Customer<>("홍길동", 30, 100);
		// Customer는 order를 포함한 자식만 선언가능.
		
		Order o = new Order(1234, "정보보호론", "2019-07-01");
		
		c1.addOrders(o);
		
		SpecialCustomer<SpecialOrder> c2 = new SpecialCustomer<>("김길동", 31, 150, 50);
		// SpecialCustomer는  SpecialOrder만 선택가능 (order는 선택불가능)
		
		SpecialOrder so = new SpecialOrder(1234, "정보보호론", "2019-07-01", "각티슈");

		c2.addOrders(so);
		
		ArrayList al = new ArrayList();
		Customer<Order> c3 = new Customer<>("최길동", 30, 100);

		al.add(c1);
		al.add(c2);
		al.add(c3);
		
		Collections.sort(al);   // 점수순서대로 정렬. 
		
		System.out.println(al.toString());

	}

}
--------------------------------------------------------------------------

package Week03.day0723;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FilterStreamTest {

	public static void main(String[] args) {
		
		//보조Stream - Filter 입출력
		//소문자로 변경
		int c = 0;
		try {
			InputStream in = new LowerCaseInputStream(new BufferedInputStream(new FileInputStream("C:\\Temp\\practice0722.java")));
			
			while((c=in.read())>=0) {
				System.out.println((char)c);
			}
			in.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}

class LowerCaseInputStream extends FilterInputStream{ //Filter대상 메소드 재정의

	protected LowerCaseInputStream(InputStream in) {
		super(in);
	} 
	
	public int read() throws IOException{ // read는 읽어들이는 값을 불러옴.
		int c = super.read();
		return (c==-1 ? c : Character.toLowerCase((char)c));
	}
	
	public int read(byte[] b, int offset, int len) throws IOException{
		int result = super.read(b, offset, len);
		for(int i = offset; i<offset+result; i++) {
			b[i] = (byte)Character.toLowerCase((char)b[i]);
		}
		return result;
	}
	
}
--------------------------------------------------------------------------

package Week03.day0723;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;

public class FilterReaderTest extends FilterReader{
	
	public FilterReaderTest(Reader in) {
		super(in);
	}
	//read 메소드를 override한다.
	//주석부분은 읽지 않도록 filter 처리
	public int read(char[] buf, int offset, int len) throws IOException{
		int numChars = 0;
		boolean inComment = false;
		while(numChars ==0) {
			numChars = in.read(buf, offset, len);
			if(numChars ==-1)
				return -1;
			int last = offset;
			for(int i=offset; i<offset+numChars; i++) {
				// 주석부분은 filter로서 걸러낸다.
				if(inComment) {
					if((buf[i]=='*') && (buf[i+1]=='/')){
						// System.out.println("주석1");
						inComment = false; //주석종료알림
						i++;
					}
				} else {
					if((buf[i]=='/') && (buf[i+1]=='*')){
						// System.out.println("주석2");
						inComment = true; // 주석시작
						i++;
				} else {
					buf[last++] = buf[i]; //Data 담기
				}
			}
		}
		numChars = last - offset;
	}
	return (numChars);
	}
	
	public int read() throws IOException{
		char[] buf = new char[1];
		//유니코드로서 2byte씩 읽어 들인다.
		int result = read(buf, 0, 1);
		if(result==-1) {
			return -1;
		} else {
			return ((int)buf[0]);
		}
	}

	public static void main(String[] args) {
		
		//보조Stream - Filter 입출력
		
		FileReader f = null;
		BufferedReader in = null;
		String buf;
		try {
			//File Input Stream을 생성한다.
			f = new FileReader("practice0722.java");
			//File Stream 인자로 하는 Filter Stream을 생성하여 이를 Buffer Stream에 연결한다.
			in = new BufferedReader(new FilterReaderTest(f));
			//한줄씩 읽어들인다.  readLine() 은 내부에서 read() 메소드를 이용하여 작동한다.
			while((buf = in.readLine()) != null) {
				System.out.println(buf);
			}
			in.close();
		} catch(Exception e) {
			System.out.println(e);
		}
	}
}

--------------------------------------------------------------------------

package Week03.day0723;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class BufferedReaderWriter {

	public static void main(String[] args) {
		
		// 보조Stream- Buffer 입출력
		
		FileReader fr = null;
		FileWriter fw = null;
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		Date d = null;
		try {
			// "ReadFile.txt" 파일을 읽는 FileReader 객체 생성
			// BufferedReader 객체 생성
			fr = new FileReader("C:\\Temp\\practice0722.java");
			br = new BufferedReader(fr);
			
			//FileWriter로 파일 "Copy.File.txt"에 출력한다. 기존파일은 덮어쓴다.
			//BufferedWriter 객체 생성
			fw = new FileWriter("C:\\Temp\\practice0722.java", false);
			bw = new BufferedWriter(fw);
			
			String s = null;
			d = new Date();
			
			//파일 복사 시작 시간
			long start = d.getTime();
			
			//ReadFile.txt에서 한줄씩 읽어서 BufferedReader에 저장한다.
			while((s=br.readLine())!=null) {
				//읽은 데이터(한줄)를 BufferedWriter에 쓴다.
				//한줄씩 읽으므로, newLine() 메소드로 줄바꿈을 해준다.
				bw.write(s);
				bw.newLine(); 
			}
			
			// 복사 완료된 시간을 얻는다.
			d = new Date();
			long end = d.getTime();
					
			System.out.println("복사 시간 : " + (end-start)); // 복사 시간 : 0
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			//BufferedReader FileReader를 달아준다.
			if(br !=null)try {br.close();}catch(IOException e) {}
			if(fr !=null)try {fr.close();}catch(IOException e) {}
			
			//BufferedWriter FileWriter를 달아준다.
			if(bw !=null)try {bw.close();}catch(IOException e) {}
			if(fw !=null)try {fw.close();}catch(IOException e) {}
		}


	}

}
--------------------------------------------------------------------------

package Week03.day0723;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;

public class ObjectInputOutputTest {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		FileOutputStream ostream = new FileOutputStream("practice0722.java");
		ObjectOutputStream p = new ObjectOutputStream(ostream);
		p.writeInt(12345);
		p.writeObject("Today");
		p.writeObject(new Date());
		p.flush();
		ostream.close();
		
		FileInputStream istream = new FileInputStream("practice0722.java");
		ObjectInputStream p2 = new ObjectInputStream(istream);
		int i = p2.readInt();
		String today = (String)p2.readObject();
		Date date = (Date)p2.readObject();
		
		System.out.println(i);
		System.out.println(today);
		System.out.println(date);
		istream.close();

	}

}

//출력값
//12345
//Today
//Tue Jul 23 14:26:59 KST 2019

--------------------------------------------------------------------------

package Week03.day0723;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class ObjectData implements Serializable{
	String name;
	int age;
	float height;
	public ObjectData() {
		this("Noname", 0, 0.0f);
	}
	
	public ObjectData(String name, int age, float height) {
		this.name = name;
		this.age = age;
		this.height = height;
	}
	
	private void writeObject(ObjectOutputStream stream) throws IOException {
		stream.defaultWriteObject();
		System.out.println("writeObject:");
	}
	
	private void readObject(ObjectInputStream stream) throws ClassNotFoundException, IOException {
		stream.defaultReadObject();
		System.out.println(" readObject : ");
	}
	
	public String toString() {
		return("name : " + name+ ", age: " + age + ", height : " + height);
	}
}

public class ObjectInputOutputTest2 {

	public static void main(String[] args) {
		ObjectData[] data = new ObjectData[3];
		data[0] = new ObjectData("YongWoo", 26, 168f);
		data[1] = new ObjectData("Kildong", 19, 174.8f);
		data[2] = new ObjectData("Dongsoo", 30, 169.4f);
		
		try {
			FileOutputStream outf = new FileOutputStream("practice0722.java");
			ObjectOutput out = new ObjectOutputStream(outf);
			out.writeInt(data.length);
			System.out.println("Number : " + data.length);
			//Object 개수만큼 Object를 출력한다.
			for(int i = 0; i<data.length; i++) {
				out.writeObject(data[i]);
				System.out.println(data[i]);
			}
			out.close();
			FileInputStream inf = new FileInputStream("practice0722.java");
			ObjectInput in = new ObjectInputStream(inf);
			int numberOfData;
			ObjectData objData;
			numberOfData = in.readInt();
			System.out.println("Number : " + numberOfData);
			//Object개수만큼 읽어들인다.
			for(int i = 0; i<numberOfData; i++) {
				objData = (ObjectData)in.readObject();
				System.out.println(objData);
			}
			in.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

//출력값
//Number : 3
//writeObject:
//name : YongWoo, age: 26, height : 168.0
//writeObject:
//name : Kildong, age: 19, height : 174.8
//writeObject:
//name : Dongsoo, age: 30, height : 169.4
//Number : 3
// readObject : 
//name : YongWoo, age: 26, height : 168.0
// readObject : 
//name : Kildong, age: 19, height : 174.8
// readObject : 
//name : Dongsoo, age: 30, height : 169.4
--------------------------------------------------------------------------
package Week03.day0723;

import java.net.InetAddress;
import java.rmi.UnknownHostException;
import java.util.Arrays;

public class NetworkEx1 {

	public static void main(String[] args) {
		
		InetAddress ip = null;
		InetAddress[] ipArr = null;
		
		try {
			ip = InetAddress.getByName("www.naver.com");
			System.out.println("getHostName() : " + ip.getHostName());
			System.out.println("getHostAddress() : " + ip.getHostAddress());
			System.out.println("toString(): " + ip.toString());
			
			byte[] ipAddr = ip.getAddress();
			System.out.println("getAddress() : " + Arrays.toString(ipAddr));
			
			String result = "";
			for(int i=0; i<ipAddr.length; i++) {
				result+=(ipAddr[i]<0) ? ipAddr[i] + 256 : ipAddr[i];
				result+=".";
			}
			System.out.println("getAddress() + 256 : " + result);
			System.out.println();
		} catch(java.net.UnknownHostException e) {
			e.printStackTrace();
		}
		
		try {
			ip = InetAddress.getLocalHost();
			System.out.println("getHostName() : " + ip.getHostName());
			System.out.println("getHostAddress() : " + ip.getHostAddress());
			System.out.println();
		} catch(java.net.UnknownHostException e) {
			e.printStackTrace();
		}
		
		try {
			ipArr = InetAddress.getAllByName("www.naver.com");
			
			for(int i=0; i<ipArr.length; i++) {
				System.out.println("ipArr[" + i + "] : " + ipArr[i]);
			}
		} catch(java.net.UnknownHostException e) {
			e.printStackTrace();
		}
	}
}

//출력값
//getHostName() : www.naver.com
//getHostAddress() : 210.89.164.90
//toString(): www.naver.com/210.89.164.90
//getAddress() : [-46, 89, -92, 90]
//getAddress() + 256 : 210.89.164.90.
//
//getHostName() : DESKTOP-CCP86DI
//getHostAddress() : 192.168.0.27
//
//ipArr[0] : www.naver.com/210.89.164.90
//ipArr[1] : www.naver.com/125.209.222.141

--------------------------------------------------------------------------
package Week03.day0723;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class NetworkEx4 {

	public static void main(String[] args) {
		
		//URL객체 예제2
		//Stream으로 바로 접근하여 Data를 주고 받는다.
		
		URL url = null;
		BufferedReader input = null;
		String address = "http://192.168.0.16:8090/pro07/memberForm.html";
		String line = "";
		
		try {
			url = new URL(address);
			
			//Stream을 reader로 바꿔준다.
			input = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
			
			while((line=input.readLine())!=null) {
				System.out.println(line);
			}
			input.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

//출력값
//<!DOCTYPE html>
//<html>
//<head>
//<meta charset="UTF-8">
//<title>회원 가입창</title>
//<script type="text/javascript">
//function fn_sendMember(){
//   var frmMember=document.frmMember;
//   var id=frmMember.id.value;
//   var pwd=frmMember.pwd.value;
//   var name=frmMember.name.value;
//   var email=frmMember.email.value;
//   if(id.length==0 ||id==""){
//      alert("아이디는 필수입니다.");
//   }else if(pwd.length==0 ||pwd==""){
//      alert("비밀번호는 필수입니다.");
//   }
//   else if(name.length==0 ||name==""){
//      alert("이름은 필수입니다.");
//   }else if(email.length==0 ||email==""){
//      alert("이메일은 필수입니다.");
//   }else{
//      frmMember.method="post";
//      frmMember.action="member3";
//      frmMember.submit();
//   } 
//}
//</script>
//</head>
//<body>
//  <form name="frmMember">
//  <table>
//	   <th>회원 가입창</th>
//	  <tr>
//		<td>아이디</td>
//		<td><input type="text" name="id"></td>
//	  </tr>
//	  <tr>
//		<td>비밀번호</td>
//		<td><input type="password" name="pwd"></td>
//	  </tr>
//	  <tr>
//		<td>이름</td>
//		<td><input type="text" name="name"></td>
//	  </tr>
//	    <tr>
//		<td>이메일</td>
//		<td><input type="text" name="email"></td>
//	  </tr>
//  </table>
//   <input type="button" value="가입하기" onclick="fn_sendMember()">
//   <input type="reset" value="다시입력">
//   <input  type="hidden" name="command" value="addMember" />	
//  </form>
// </body>
//</html>
//
--------------------------------------------------------------------------

package Week03.day0723;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;

public class NetworkEx5 {

	public static void main(String[] args) {
		
		//URL객체 예제3 - download
		
		URL url = null;
		InputStream in = null; // 리소스에서 읽어들인다.
		FileOutputStream out = null;
		String address = "http://192.168.0.16:8090/pro07/memberForm.html";
		
		int ch=0;
		
		try {
			url = new URL(address);
			in = url.openStream();
			out = new FileOutputStream("memberForm.html");
			
			while((ch=in.read())!=-1) {
				System.out.println("downloading..."); // 출력값 : downloading... 주구장창 나옴
				out.write(ch);
			}
			in.close();
			out.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

--------------------------------------------------------------------------

package Week03.day0723;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLConnectionTest {

	public static void main(String[] args) {
		
		//URLConnection 예제2 - HttpURLConnection
		//서버에서 검색조건을 넣고 검색버튼을 누르는 기능과 유사
		
		String input = "query=un";
		try {
			/* Set up*/
			URL naver = new URL("http://kin.naver.com/search/list.nhn");
			HttpURLConnection urlConn = (HttpURLConnection)naver.openConnection();
			urlConn.setDoOutput(true); // Output을 사용가능하게 설정
			// urlConn.setRequestMethod("POST");
			
			/*write - 서버에 Write*/
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(urlConn.getOutputStream()));
			bw.write(input);
			bw.flush();
			bw.close();
			
			/*read - 서버에서 결과 read*/
			BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));
			String inputLine;
			while((inputLine = br.readLine())!=null) {
				System.out.println(inputLine);
			}
			br.close();
		} catch (Exception e) {
			System.out.println("Exception : " + e.toString());
		}
	}
}
--------------------------------------------------------------------------

package Week03.day0723;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;

public class TcpIpMultichatServer {
	
	HashMap clients; // 모든 Client를 HashMap에 담고 있다.
	
	TcpIpMultichatServer(){
		clients = new HashMap();
		Collections.synchronizedMap(clients);
	}
	
	public void start() {
		ServerSocket serverSocket = null;
		Socket socket = null;
	
	try {
		serverSocket = new ServerSocket(7777);
		System.out.println("서버가 시작되었습니다.");
		
		while(true) {
			//Server가 Client의 접속을 계속 기다린다.
			socket = serverSocket.accept();
			System.out.println("[" + socket.getInetAddress() + ":" + socket.getPort() + "]" + "에서 접속하였습니다." );
			//접속할  Client와 통신할 Thread를 Client와 통신할 Socket을 가지고 만들어 띄워준다.
			ServerReceiver thread = new ServerReceiver(socket); // 내부 class
			thread.start();
		}
	}catch(Exception e) {
		e.printStackTrace();
	}
	
	}// start()
	
	void sendToAll(String msg) {
		Iterator it = clients.keySet().iterator();
		
		while(it.hasNext()) {
			try {
				DataOutputStream out = (DataOutputStream)clients.get(it.next());
				out.writeUTF(msg);
			} catch(IOException e) {}
		} // while
	} // sendToAll

	public static void main(String[] args) {
		new TcpIpMultichatServer().start();
	}
	
	class ServerReceiver extends Thread{
		Socket socket;
		DataInputStream in;
		DataOutputStream out;
		
		ServerReceiver(Socket socket){
			this.socket = socket;
			try {
				in = new DataInputStream(socket.getInputStream());
				out = new DataOutputStream(socket.getOutputStream());
			} catch (IOException e) {}
		}
		
		public void run() {
			String name = "";
			try {
				name = in.readUTF(); // 문자열 Read
				sendToAll("#" + name + "님이 들어오셨습니다.");
				
				clients.put(name, out); // clients는 외부 class 의 멤버변수로 client별 outputStream을 담고 있다.
				System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
				
				while(in!=null) {
					sendToAll(in.readUTF()); // Read한 내용을 모든 Client에서 전달한다
				}
			} catch(IOException e) {
				//ignore
			} finally {
				sendToAll("#" + name + "님이 나가셨습니다.");
				clients.remove(name);
				System.out.println("[" + socket.getInetAddress() + ":" + socket.getPort() + "]" + "에서 접속을 종료하였습니다.");
				System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
			} //try
		} //run
	} //ReceiverThread
} // class
--------------------------------------------------------------------------
package Week03.day0723;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TcpIpMultichatClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		String chatName = "bit_chat2";
		
		try {
			String serverIp = "192.168.0.32";
//			String serverIp = "127.0.0.1";
			//소켓을 생성하여 연결을 요청한다.
			Socket socket = new Socket(serverIp, 7777);
			System.out.println("서버에 연결되었습니다.");
			Thread sender = new Thread(new ClientSender(socket, chatName)); //서버로 chat문장 write
			Thread receiver = new Thread(new ClientReceiver(socket)); // 서버에서 chat문장 read
			
			sender.start();
			receiver.start();
		} catch(ConnectException ce) {
			ce.printStackTrace();
		}
	} // main

	//서버에 chat문장을 전달하는 thread
	static class ClientSender extends Thread{
		Socket socket;
		DataOutputStream out;
		String name;
		
		ClientSender(Socket socket, String name){
			this.socket = socket;
			try {
				out = new DataOutputStream(socket.getOutputStream());
				this.name = name;
			} catch(Exception e) {
			}
		}
	public void run() {
		//대화를 입력
		Scanner scanner = new Scanner(System.in);
		try {
			if(out!=null) {
				out.writeUTF(name); //chat 이름을 서버에 전달
			}
			
			while(out!=null) {
				out.writeUTF("[" + name + "]" + scanner.nextLine()); // 채팅문장 서버에 전달
			}
		} catch(IOException e) {
		}
		}// run()
	}// clientSender
	
	//Server에서 전달하는 chat문장을 Read 하는 thread
	static class ClientReceiver extends Thread{
		Socket socket;
		DataInputStream in;
		
		ClientReceiver(Socket socket){
			this.socket = socket;
			try {
				in = new DataInputStream(socket.getInputStream());
			} catch (IOException e) {
			}
		}
		
		public void run() {
			while(in!=null) {
				try {
					System.out.println(in.readUTF());
				} catch(IOException e) {
				}
			}
		} // run()
	} //ClientReceiver
} // class


--------------------------------------------------------------------------

package Week03.day0723;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		
		ServerSocket serverSocket = null;
		try {
			//서버소켓을 생성하여 7777번 포트와 결합(bind)시킨다.
			serverSocket = new ServerSocket(7777);
			System.out.println("[Server]" + getTime() + "서버가 준비되었습니다.");
		} catch(IOException e) {
			e.printStackTrace();
		}
		while(true) {
			try {
				System.out.println("[Server]" + getTime() + "연결요청을 기다립니다.");
				//서버소켓은 클라이언트의 연결요청이 올 때까지 실행을 멈추고 계속 기다린다.
				//클라이언트의 연결요청이 오면 클라이언트 소켓과 통신할 새로운 소켓을 생성한다.
				Socket socket = serverSocket.accept();
				System.out.println("[Server]" + getTime() + socket.getInetAddress() + "로부터 연결요청이 들어왔습니다.");
				
				//소켓의 출력스트림을 얻는다.
				OutputStream out = socket.getOutputStream();
				DataOutputStream dos = new DataOutputStream(out);
				
				//원격 소켓(remote socket)에 데이터를 보낸다.
				dos.writeUTF("[Notice] Test Message1 from Server.");
				System.out.println("[Server]" + getTime() + "데이터를 전송했습니다.");
				
				//스트림과 소켓을 닫아준다.
				dos.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} // while
	}
}
--------------------------------------------------------------------------
package Week03.day0723;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.Socket;

public class Client {

	public static void main(String[] args) {
		
		//커넥션의 기본
		
		try {
			String serverIp = "127.0.0.1";
			
			System.out.println("[Client]" + "서버에 연결중입니다. 서버IP : " + serverIp);
			//소켓을 생성하여 연결을 요청한다.
			Socket socket = new Socket(serverIp, 7777);
			
			//소켓의 입력스트림을 얻는다.
			InputStream in = socket.getInputStream();
			DataInputStream dis = new DataInputStream(in);
			
			//소켓으로부터 받은 데이터를 출력한다.
			System.out.println("[Client]" + "서버로부터 받은 메세지 : " + dis.readUTF());
			System.out.println("[Clinet]" + "연결을 종료합니다.");
			
			//스트림과 소켓을 닫는다.
			dis.close();
			socket.close();
			System.out.println("[Client]" + "연결이 종료되었습니다.");
		} catch(ConnectException ce) {
			ce.printStackTrace();
		} catch(IOException ie) {
			ie.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();
		}

	}

}





'Java' 카테고리의 다른 글

디버깅하는 법  (0) 2019.07.31
주차관리 시스템 ver.2  (0) 2019.07.24
객체 정렬하기  (0) 2019.07.23
Java - Stream(byte, 문자)  (0) 2019.07.22
Java - Thread(싱글, 다중(멀티), 스위칭), 동기화  (0) 2019.07.19
And